本文整理自博文PageRank算法 – 从原理到实现
1. 算法来源
这个要从搜索引擎的发展讲起。最早的搜索引擎采用的是 分类目录1的方法,即通过人工进行网页分类并整理出高质量的网站。那时 Yahoo 和国内的 hao123 就是使用的这种方法。
后来网页越来越多,人工分类已经不现实了。搜索引擎进入了 文本检索 的时代,即计算用户查询关键词与网页内容的相关程度来返回搜索结果。这种方法突破了数量的限制,但是搜索结果不是很好。因为总有某些网页来回地倒腾某些关键词使自己的搜索排名靠前。
谷歌的两位创始人,当时还是美国斯坦福大学 (Stanford University) 研究生的佩奇 (Larry Page) 和布林 (Sergey Brin) 开始了对网页排序问题的研究。他们的借鉴了学术界评判学术论文重要性的通用方法, 那就是看论文的引用次数。由此想到网页的重要性也可以根据这种方法来评价。于是PageRank的核心思想就诞生了2,非常简单:
- 如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高
- 如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高
就如下图所示(一个概念图):
2. 算法原理
PageRank算法3简单来说分为两步:
- 给每个网页一个PR值(下面用PR值指代PageRank值)
- 通过(投票)算法不断迭代,直至达到平稳分布为止。
互联网中的众多网页可以看作一个有向图。下图是一个简单的例子
由于PR值物理意义上为一个网页被访问概率,所以初始值可以假设为 1 N {1\over N} N1,其中N为网页总数。一般情况下,所有网页的PR值的总和为1。(如果不为1的话也不是不行,最后算出来的不同网页之间PR值的大小关系仍然是正确的,只是不能直接地反映概率了。而且公式也不再是本文提供的公式了。详情见此博文。)
A、B、C三个页面都链入D页面,则D的PR值将是A、B、C三个页面PR值的总和:
继续上面的假设,A除了链接到D以外,A还链接了C和B,那么当用户访问 A 的时候,就有跳转到 B、C 或者 D 的可能性,跳转概率均为 1/3。在计算D的PR值时,A的PR值只能投出 1 3 1\over 3 31的票,B的PR值只能投出 1 2 1\over 2 21的票,而C只链接到D,所以能投出全票,所以A的PR值总和应为:
P R ( D ) = P R ( A ) / 3 + P R ( B ) / 2 + P R ( C ) PR(D)=PR(A)/3+PR(B)/2+PR(C) PR(D)=PR(A)/3+PR(B)/2+PR(C)
所以可以得出一个网页的PR值计算公式应为:
P R ( u ) = ∑ v ∈ B u P R ( v ) L ( v ) PR(u)=\sum_{v\in B_u}{PR(v)\over L(v)} PR(u)=v∈Bu∑L(v)PR(v)
其中, B u B_u Bu是所有链接到网页u的网页集合,网页v是属于集合 B u B_u Bu的一个网页,L(v)则是网页v的对外链接数(即出度)
表2-2 根据图2-1计算的PR值
表2-2,经过几次迭代后,PR值逐渐收敛稳定。
2.1 排名泄露
如图2-3所示,如果存在网页没有出度链接,如A节点所示,则会产生排名泄露问题,经过多次迭代后,所有网页的PR只都趋向于0。
2.1.1 解决办法
图中的A网页没有出链,对其他网页没有PR值的贡献,为了满足 Markov 链的收敛性,于是我们设定其对所有的网页(包括它自己)都有出链,则此图中B的PR值可表示为:
P R ( B ) = P ( A ) 4 + P R ( D ) 2 PR(B)={P(A)\over 4} + {PR(D)\over 2} PR(B)=4P(A)+2PR(D)
2.2 排名下沉
如图1-5所示,若网页没有入度链接,如节点A所示,经过多次迭代后,A的PR值会趋向于0。
2.3 排名上升
互联网中一个网页只有对自己的出链,或者几个网页的出链形成一个循环圈。那么在不断地迭代过程中,这一个或几个网页的PR值将只增不减。如下图中的C网页:
为了解决这个问题。我们想象一个随机浏览网页的人,当他到达C网页后,显然不会傻傻地一直被C网页的小把戏困住。我们假定他有一个确定的概率会输入网址直接跳转到一个随机的网页,并且跳转到每个网页的概率是一样的。
于是则此图中C的PR值可表示为:
P R ( C ) = α ( P R ( D ) 2 + P R ( A ) 3 ) + ( 1 − α ) 4 PR(C) = \alpha(\frac{ PR(D)}{2}+\frac{ PR(A)}{3}) + \frac{(1 - \alpha)}{4} PR(C)=α(2