< 链接分析算法 - PageRank算法 >
背景
Google 的两位创始人拉里佩奇
&
谢尔盖布林都是斯坦福大学的博士生,他们提出的 PageRank 算法受到了论文影响力因子的评价启发。当一篇论文被引用的次数越多,证明这篇论文的影响力越大。正是这个想法解决了当时网页检索质量不高的问题。- 核心思想是:
如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是pagerank值会相对较高;
如果一个pagerank值很高的网页链接到一个其他的网页,那么被链接到的网页的pagerank值会相应地因此而提高。
PageRank - 简化模型
网页之间会形成一个网络,是我们的互联网,论文之间也存在着相互引用的关系,可以说我们所处的环境就是各种网络的集合。只要是有网络的地方,就存在出链和入链,就会有 PR 权重的计算,也就可以运用我们今天讲的 PageRank 算法。
-
PageRank
计算:\(PR(u) = Σ \frac{PR(v)}{L(v)}\),
u
为待评估页面,v
为页面u
的入链集合,PR(*)
为页面影响力,L(*)
为页面的出链数量(也就是跳转频率)。简单来说就是一个网页的影响力=
所有入链集合页面的加权影响力之和,每个页面又把影响力平均分配给了出链页面。假设\(w\)为影响力,有\(N\)个页面,上式可以用
Markov
链的转移概率矩阵表示为\(w^{k}=L \cdot w^{k-1}\),\(L _ {N \cdot N}\)为转移矩阵(跳转频率)。初始化影响力\(w^{0}\),利用上式迭代直至收敛不再发生变化。
算法证明:PageRank算法--从原理到实现
- 实际面临问题:
Rank Leak
等级泄露:如果一个网页只有入链没有出链,吸收其他网页影响力而不释放,收敛最后会导致其他网页PR
值为0
。Rank Sink
等级沉没:如果有一个网页只有出链没有入链,释放自己的影响力而不吸收,收敛最后会导致该网页PR
值为0
。
PageRank - 随机浏览模型
随机浏览模型假设场景是:用户并不是都按照跳转链接的方式来上网,还有一种可能是不论当前处于哪个页面,都有概率访问到其他任意的页面(比如说直接输入网址访问),相当于跳转链接而言随机概率较小。
-
PageRank
计算:\(PR(u)=\frac{1-d}{N} + d \cdot Σ \frac{PR(v)}{L(v)}\),
damping factor
阻尼因子\(d\)代表了用户按照跳转链接来上网的概率,通常定义值为0.85
,\(N\)为网页总数。因为加入了阻尼因子的存在,一定程度上解决了等级泄露和等级沉没的问题,可以通过数学推导证明最终
PageRank
随机浏览模型是可以收敛的,每个网页可以得到一个稳定正常的PR
值。
- 其他方面:
PageRank
时间复杂度为\(O(t(\varepsilon )n^{2})\),\(n\)是网络节点数,\(t(\varepsilon )\)是迭代次数,与收敛的阈值\(\varepsilon\)有关。对大型网络而言,迭代次数与边的关系是接近线性的\(logN\)。-
PageRank
主要缺点是对新网页不友好,旧页面等级会比新页面高,因为即使是非常好的新页面也不会有很多的外链。
没有过滤广告链接和功能链接。这些链接通常没有什么实际价值,前者链接到广告页面,后者常常链接到某个社交网站首页。
没有区分站内导航链接。很多网站的首页都有很多对站内其他页面的链接,称为站内导航链接。这些链接与不同网站之间的链接相比,肯定是后者更能体现PageRank值的传递关系。
PageRank
主要挑战是来自海量的数据。后续多为
HITS, TrustRank
替代。
PageRank - 算法实现
- 使用NetworkX实现计算网页的
PR
值
import networkx as nx
# 创建有向图
G = nx.DiGraph()
# 有向图之间边的关系
edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
for edge in edges:
G.add_edge(edge[0], edge[1])
pagerank_list = nx.pagerank(G, alpha=1)
print("pagerank 值是:", pagerank_list)
NetworkX常用操作与希拉里邮件案例:机器学习经典算法之PageRank
Mapreduce
实现版本:深入浅出PageRank算法