我正在尝试解决一个关于用MapReduce实现PageRank的理论问题。
我有以下三个节点的简单场景:A、B、C。
邻接矩阵如下:
A { B, C }
B { A }例如,B的PageRank等于:
(1-d)/N + d ( PR(A) / C(A) )
N = number of incoming links to B
PR(A) = PageRank of incoming link A
C(A) = number of outgoing links from page A我对所有的原理图以及映射器和减速器如何工作都很满意,但我不明白在减速器计算的时候,C(A)是如何知道的。在通过将传入链接聚合到B来计算B的PageRank时,reducer将如何知道每个页面的传出链接的数量。这是否需要在某些外部数据源中进行查找?
发布于 2012-11-26 23:49:18
下面是一个伪代码:
map( key: [url, pagerank], value: outlink_list )
for each outlink in outlink_list
emit( key: outlink, value: pagerank/size(outlink_list) )
emit( key: url, value: outlink_list )
reducer( key: url, value: list_pr_or_urls )
outlink_list = []
pagerank = 0
for each pr_or_urls in list_pr_or_urls
if is_list( pr_or_urls )
outlink_list = pr_or_urls
else
pagerank += pr_or_urls
pagerank = 1 - DAMPING_FACTOR + ( DAMPING_FACTOR * pagerank )
emit( key: [url, pagerank], value: outlink_list )在reduce中,你应该输出外部链接而不是内部链接,这一点很重要,正如intenret上的一些文章所建议的那样。这样,连续的迭代也会有外部链接作为映射器的输入。
请注意,来自同一页面的具有相同地址的多个外部链接被视为一个链接。另外,不要计算循环次数(页面链接到自身)。
传统上,阻尼因子为0.85,不过您也可以使用其他值。
发布于 2011-02-18 07:21:41
A detailed explanation with Python code,迈克尔·尼尔森著。
发布于 2011-02-17 21:50:33
我们迭代地评估PR。PR(x) = Sum(PR(a)*weight(a),a in in_links) by
map ((url,PR), out_links) //PR = random at start
for link in out_links
emit(link, ((PR/size(out_links)), url))
reduce(url, List[(weight, url)):
PR =0
for v in weights
PR = PR + v
Set urls = all urls from list
emit((url, PR), urls)所以输出等于输入,我们可以这样做,直到覆盖。
https://stackoverflow.com/questions/5029285
复制相似问题