本文将介绍PageRank算法的相关内容,具体如下:
1.算法来源
2.算法原理
3.算法证明
4.PR值计算方法
4.1 幂迭代法
4.2 特征值法
4.3 代数法
5.算法实现
5.1 基于迭代法的简单实现
5.2 MapReduce实现
6.PageRank算法的缺点
7.写在最后
参考资料
1. 算法来源
这个要从搜索引擎的发展讲起。最早的搜索引擎采用的是 分类目录[^ref_1] 的方法,即通过人工进行网页分类并整理出高质量的网站。那时 Yahoo 和国内的 hao123 就是使用的这种方法。
后来网页越来越多,人工分类已经不现实了。搜索引擎进入了 文本检索 的时代,即计算用户查询关键词与网页内容的相关程度来返回搜索结果。这种方法突破了数量的限制,但是搜索结果不是很好。因为总有某些网页来回地倒腾某些关键词使自己的搜索排名靠前。
于是我们的主角要登场了。没错,谷歌的两位创始人,当时还是美国斯坦福大学 (Stanford University) 研究生的佩奇 (Larry Page) 和布林 (Sergey Brin) 开始了对网页排序问题的研究。他们的借鉴了学术界评判学术论文重要性的通用方法, 那就是看论文的引用次数。由此想到网页的重要性也可以根据这种方法来评价。于是PageRank的核心思想就诞生了[^ref_2],非常简单:
- 如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高
- 如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高
就如下图所示(一个概念图):
2. 算法原理
PageRank算法[^ref_3]总的来说就是预先给每个网页一个PR值(下面用PR值指代PageRank值),由于PR值物理意义上为一个网页被访问概率,所以一般是1N1N,其中N为网页总数。另外,一般情况下,所有网页的PR值的总和为1。如果不为1的话也不是不行,最后算出来的不同网页之间PR值的大小关系仍然是正确的,只是不能直接地反映概率了。
预先给定PR值后,通过下面的算法不断迭代,直至达到平稳分布为止。
互联网中的众多网页可以看作一个有向图。下图是一个简单的例子[^ref_4]:
这时A的PR值就可以表示为:
PR(A)=PR(B)+PR(C)PR(A)=PR(B)+PR(C)
然而图中除了C之外,B和D都不止有一条出链,所以上面的计算式并不准确。想象一个用户现在在浏览B网页,那么下一步他打开A网页还是D网页在统计上应该是相同概率的。所以A的PR值应该表述为:
PR(A)=PR(B)2+PR(C)1PR(A)=PR(B)2+PR(C)1
互联网中不乏一些没有出链的网页,如下图:
图中的C网页没有出链,对其他网页没有PR值的贡献,我们不喜欢这种自私的网页(其实是为了满足 Markov 链的收敛性),于是设定其对所有的网页(包括它自己)都有出链,则此图中A的PR值可表示为:
PR(A)=PR(B)2+PR(C)4PR(A)=PR(B)2+PR(C)4
然而我们再考虑一种情况:互联网中一个网页只有对自己的出链,或者几个网页的出链形成一个循环圈。那么在不断地迭代过程中,这一个或几个网页的PR值将只增不减,显然不合理。如下图中的C网页就是刚刚说的只有对自己的出链的网页:
为了解决这个问题。我们想象一个随机浏览网页的人,当他到达C网页后,显然不会傻傻地一直被C网页的小把戏困住。我们假定他有一个确定的概率会输入网址直接跳转到一个随机的网页,并且跳转到每个网页的概率是一样的。于是则此图中A的PR值可表示为:
PR(A)=α(PR(B)2)+(1−α)4PR(A)=α(PR(B)2)+(1−α)4
在一般情况下,一个网页的PR值计算如下:
PR(pi)=α∑pj∈MpiPR(pj)L(pj)+(1−α)NPR(pi)=α∑pj∈MpiPR(pj)L(pj)+(1−α)N
其中MpiMpi是所有对pipi网页有出链的网页集合,L(pj)L(pj)是网页pjpj的出链数目,NN是网页总数,αα一般取0.85。
根据上面的公式,我们可以计算每个网页的PR值,在不断迭代趋于平稳的时候,即为最终结果。具体怎样算是趋于平稳,我们在下面的PR值计算方法部分再做解释。
3. 算法证明
- limn→∞Pnlimn→∞Pn是否存在?
- 如果极限存在,那么它是否与P0P0的选取无关?
PageRank算法的正确性证明包括上面两点[^ref_5]。为了方便证明,我们先将PR值的计算方法转换一下。
仍然拿刚刚的例子来说
我们可以用一个矩阵来表示这张图的出链入链关系,Sij=0Sij=0表示jj网页没有对ii网页的出链:
S=⎛⎝⎜⎜⎜⎜01/31/31/31/2001/2001001/21/20⎞⎠⎟⎟⎟⎟S=(01/2001/3001/21/3011/21/31/200)
取ee为所有分量都为 1 的列向量,接着定义矩阵:
A=αS+(1−α)NeeTA=αS+(1−α)NeeT
则PR值的计算如下&#x