您的位置:首页 > 其它

PageRank及其MapReduce实现

2015-08-08 17:30 246 查看
Pagerank是一个衡量网页重要性的算法,这个算法把互联网上的网页集合看成一个有向图,每个网页是一个节点,如果网页A有指向网页B的链接,则这两个点存在一条有向边A->B,那么如果A这个网页上有k个网页的链接,那么他会以1/k的概率从A这个网页跳到他所指的网页,所以可以用一个转移矩阵来表示一对网页集合的转移关系。



这幅图相应的转移矩阵为:



相信这个转移矩阵应该很好理解,另外就是一个初始值的问题,为了公平起见,假设一开始停在在n个网页中的概率是一致的,那么有(1/4,1/4,1/4,1/4)T为初始pagerank值,然后根据转移矩阵的左乘,每乘一次,停在某个网页的概率会变化一次,并且,在左乘很多次以后,这个向量收敛了。上面这个例子的结果是:



这表示我们最后停在第一个网页的概率是最大的,也意味着这个网页的pagerank值最高。
对于最简单的pagerank算法就是这样一个做法,一般来说,几十次左乘既可以收敛。但是现实中的网页有时候并不会这么配合这个算法,主要有两个问题:
1 这个图不是强连通图
如果到某个网页后,这个网页不存在到其他网页的路径,那么一直左乘的结果是(0,0,0..0)T,是一个零向量,因为这种情况下的转移矩阵,它至少有一个列的和不为1(可以看到正常情况下,转移矩阵的每一列的和为1,且每左乘一次向量的每一维加起来也是1),这样的后果是越乘越少,最后变成了0向量。
2 存在一个网页,它只指向它自己
那么假如到这个网页后,会一直陷在这个网页,最后的结果就是(0,0..1...0)T,唯一一个1表示的就是那个特殊的网页。
上述这两种情况的解决方法是假设浏览网页的人并不是按照这个转移矩阵一股脑走到底,而是每次转移的时候,他有一定概率,从初始化的状态开始走。那么有:



而对于第一个问题,也可以采用递归删除没有出度网页和指向它的边的办法来实现,这样的做法只剩下可以正常运算的数据,而那些删掉的网页pagerank值,可以根据正常数据算出来的值在进行转移计算,这样的做法最后的结果虽然不能保证和为1,但是pagerank值能代表网页的重要程度。

据说谷歌发明MapReduce的目的就是为了解决大规模网页的pagerank值计算,假如迭代几十次就能收敛,那么我们考虑的问题主要是一次矩阵和向量的乘法该如何优化计算。因为这里乘以一个系数在加一个向量的做法很容易实现,这里先不考虑这个问题。
其实向量乘以矩阵的mapreduce做法在我博客里面已经有一些介绍,但对于一些超大规模的数据,还是想提一些看起来还不错的算法,假如说这个矩阵就算按照(i,j,mij)这个的方式存储还是不能整个放入内存,那么可以将这个矩阵按列分成k部分,相应的,这个向量按照行分成k部分,且每部分的维度相匹配。每次计算相对于的一部分,计算k次最后将结果汇总即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: