MapReduce 之PageRank 算法概述、设计思路和源码分析

早就对PageRank 算法感兴趣,但一直都是轮廓性的概念,没有具体深入学习。最近要学习和总结MapReduce 的实例,就又把PageRank 算法重新学习了一遍,并基于MapReduce 进行了实现。

1. PageRank是什么

PageRank,网页排名,右脚网页级别。是以Google 公司创始人Larry Page 之姓来命名。PageRank 计算每一个网页的PageRank值,并根据PageRank值的大小对网页的重要性进行排序。PageRank的基本思想是:对于一个网页A来说,链接到A的页面越多,且链接到A的页面的PageRank值越大,网页A的PageRank值越大。

2. 简单的PageRank计算

首先我们对整个Web进行一个简单化处理:1、将每一个页面看做一个节点;2、如果页面A 链接页面B,则存在一条从A到B的有向边。整个Web就被抽象成一个有向图。
现在假设只有四张网页,它的结构如图所示。

这里写图片描述

显然该图是强联通的(从任一节点出发都可以达到另一任节点)。对于页面A来说,它链接到页面B,C,D,即A有3个出链,则它跳转到每个出链B,C,D的概率均为1/3.。如果A有k个出链,跳转到每个出链的概率为1/k。同理B到A,C,D的概率为1/2,0,1/2。C到A,B,D的概率为1,0,0。D到A,B,C的概率为0,1/2,1/2。

通常我们使用一种合适的数据结构来表示页面间的链接关系。设一共有N个页面,则要生成一个N维矩阵,其中第i行表示的是其他页面对 第i个页面链接的概率,第j列表示的是第j个页面对其他页面链接的概率。这样的矩阵叫做转移矩阵。对应到上图,转移矩阵为:

这里写图片描述

在上图中,第一列为页面A对各个页面转移的概率,第一行为各个页面对页面A转移的概率。初始时,每一个页面的PageRank值都是均等的,为1/N,这里也即是1/4。然后对于页面A来说,根据每一个页面的PageRank值和每个页面对页面A的转移概率,可以算出新一轮页面A的PageRank值。这里,只有页面B和页面C转移了自己的1/2给A。所以新一轮A的PageRank值为1/4*1/2+1/4*1/2=9/24。

为了计算方便,我们设置各页面初始的PageRank值为一个列向量V0。然后再基于转移矩阵,我们可以直接求出新一轮各个页面的PageRank值。即 V1 = MV0

这里写图片描述

现在得到了各页面新的PageRank值V1, 继续用M 去乘以V1 ,就会得到更新的PageRank值。一直迭代这个过程,可以证明出V最终会收敛。此时停止迭代。这时的V就是各个页面的PageRank值。在上图中,一直迭代的中间V如下:

这里写图片描述

3. 处理Dead Ends(终止点)

上面的PageRank计算方法要求整个Web是强联通的。而实际上真实的Web并不是强联通的,有一类页面,它们不存在任何外链,称之为Dead Ends(终止点)。比如下面的图:

这里写图片描述

这里节点C即是一个终止点。而上面的算法之所以能够成功收敛,很大因素上基于转移矩阵每一列加和为1(每一个页面都至少有一个出链)。当节点C没有出链时,转移矩阵M如下所示

这里写图片描述

基于这个转移矩阵和初始的PageRank列向量,每一次迭代过的PageRank列向量如下:

这里写图片描述

解决该问题的一种方法是:迭代拿掉图中的Dead Ends 点以及相关的边,之所以是迭代拿掉,是因为当拿掉最初的Dead Ends之后,又可能产生新的Dead Ends点。直到图中没有Dead Ends点为止。然后对剩余的所有节点,计算它们的PageRank ,然后以拿掉Dead Ends的逆序反推各个Dead Ends的PageRank值。

比如在上图中,首先拿掉节点C,然后发现没有产生新的Dead Ends .然后对A,B,D 计算他们的PageRank ,他们初始PageRank值均为1/3,且A有两个出链,B有两个出链,D有一个出链,那么由上面的方法可以算出各页面最终的PageRank值。假设算出A的PageRank 为x, B的PageRank 为y, D的PageRank 为z, 那么C的PageRank值为1/3*x + 1/2*z 。

4. 处理Spider Traps(蜘蛛陷阱)

通过以上可以想象到,真实的Web链接关系若是转换成转移矩阵,那必将是一个稀疏的矩阵。而稀疏的矩阵迭代相乘会使得中间产生的PageRank向量变得不平滑(一小部分值很大,大部分值很小或接近于0)。而一种Spider Traps 节点 会加剧这个不平滑的效果,也即是蜘蛛陷阱。它是指某一些节点虽然有外链,但是它只链向自己。如下图所示:

这里写图片描述

如果对这个图按照上面的方法进行迭代计算PageRank , 计算后会发现所有节点的PageRank值都会逐步转移到节点C上来,而其他节点都趋近于零。

这里写图片描述

为了解决这个问题,我们需要对PageRank 计算方法进行一个平滑处理–加入teleporting(跳转因子)。也就是说,用户在访问Web页面时,除了按照Web页面的链接关系进行选择以外,他也可能直接在地址栏上输入一个地址进行访问。这样就避免了用户只在一个页面只能进行自身访问,或者进入一个页面无法出来的情况。

加入跳转因子之后,PageRank向量的计算公式修正为:

  • 14
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值