我理解PageRank的概念,并已经实现过它(阅读了《编程集体智慧》一书)。
但是我读到它可以分布在多台服务器上(我猜Google正在这样做)。 我有点困惑,因为据我所知,你需要整个图才能对其进行PageRank,因为每个排名都是相对于其他排名的。
我找到了维基百科文章,但它并没有解释得很清楚。
有什么方法可以实现这个? 还有,额外的问题:分布式PageRank的技术是否只适用于PageRank,还是可以应用于应用于图上其他机器学习算法的方法?
我理解PageRank的概念,并已经实现过它(阅读了《编程集体智慧》一书)。
但是我读到它可以分布在多台服务器上(我猜Google正在这样做)。 我有点困惑,因为据我所知,你需要整个图才能对其进行PageRank,因为每个排名都是相对于其他排名的。
我找到了维基百科文章,但它并没有解释得很清楚。
有什么方法可以实现这个? 还有,额外的问题:分布式PageRank的技术是否只适用于PageRank,还是可以应用于应用于图上其他机器学习算法的方法?
Let
| 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 |
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 >
Mapper的输出将按键分组并由reducer获取。如果我们有5个reducers,它会像这样:
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将会像mapper一样发出信号,但是计算出的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 >
MapReduce提供了一些有趣的背景知识,可能会让你清楚如何并行化这个任务。