我理解pagerank背后的想法并实现了它(在阅读“编程集体智慧”一书时)。
但我读过它可以分布在几个服务器上(我猜谷歌正在做)。我有点困惑,因为根据我的理解,你需要整个图表才能对其进行页面排名,因为每个排名都与其他排名相关。
我找到wiki article,但没有解释太多。
有关如何做到这一点的任何建议?另外,奖励问题:是否可以将分布式pagerank专用于pagerank,或者将所用方法应用于应用于图形的其他机器学习算法?
答案 0 :(得分:8)
计算PageRank的最先进方法是使用Google Pregel框架。我很确定他们现在有更复杂的东西,但这是最新发表的努力。
您可以在research blog中详细了解相关详情。 或阅读已发表的论文here。
我正在研究名为Bulk Synchronous Parallel的Apache Hama范例的开源版本。还有Apache Giraph仅关注图形用例和许多其他用例。
与mfrankli提到的一样,还有可用于计算PageRank的MapReduce框架(例如Apache Hadoop),但它对迭代算法效率不高。
值得注意的是,两个解决方案(MapReduce和BSP)都是批处理解决方案,因此它们可能会用于重新计算完整网页的PageRank。由于Google更新比批处理算法快得多,因此您可以预期他们会经常在子图上重新计算PageRank。
答案 1 :(得分:0)
MapReduce提供了一些有趣的背景知识,可能会清除您将如何并行化此任务。
答案 2 :(得分:0)
让
| 0 0 0 1 0 |
| 0 0 0 1 0 |
| 0 0 0 1 1 |
| 1 1 1 0 0 |
| 0 0 1 0 0 |
是邻接矩阵(或图)。然后,PageRank中的过渡矩阵M
将
| 0 0 0 1/3 0 |
| 0 0 0 1/3 0 |
| 0 0 0 1/3 1 |
| 1 1 1/2 0 0 |
| 0 0 1/2 0 0 |
是列随机的,不可归约的和非周期性的。
MapReduce从这里开始。映射器的序列化输入将类似于
1 -> 4
2 -> 4
3 -> 4 , 5
4 -> 1 , 2 , 3
5 -> 3
,映射器将发出以下内容:
< 1 , [4] >
< 4 , 1 >
< 2 , [4] >
< 4 , 1 >
< 3 , [4 , 5] >
< 4 , 1/2 >
< 5 , 1/2 >
< 4 , [1, 2, 3] >
< 1 , 1/3 >
< 2 , 1/3 >
< 3 , 1/3 >
< 5 , [3] >
< 3 , 1 >
映射器的输出将按键分组,并由简化器获取。如果我们有5个减速器,它将像:
R1 takes [4] , 1/3 then computes 1/5*(1/3) = 2/30
R2 takes [4] , 1/3 then computes 1/5*(1/3) = 2/30
R3 takes [4, 5] , 1/3 , 1 then computes 1/5*(1/3 + 1) = 8/30
R4 takes [1, 2, 3] , 1 , 1 , 1/2 then computes 1/5*( 1 + 1 + 1/2) = 15/30
R5 takes [3] , 1/2 then computes 1/5*(1/2) = 3/30
现在,第一次(幂)迭代结束了。在接下来的reduce作业中,reducer会像映射器一样发出,但是,将使用PR计算的PR代替1:
< 1 , [4] >
< 4 , 2/30 >
< 2 , [4] >
< 4 , 2/30 >
< 3 , [4 , 5] >
< 4 , 4/30 >
< 5 , 4/30 >
< 4 , [1, 2, 3] >
< 1 , 5/30 >
< 2 , 5/30 >
< 3 , 5/30 >
< 5 , [3] >
< 3 , 3/30 >
重复减少作业,直到其收敛到足够或您满意为止。