了解Google公司,多半都对“PageRank”算法有所耳闻。该算法是一种典型的“从群众中来,到群众中去”的民主算法。
1,PR的计算原理:网络世界由万万千千,千千万万的网页链接而成的,一个网页通过出链和入链链接着一个或多个网页。出链指的是网页中可以跳转出去的链接,入链指的是跳进网页的链接
从图中我们很容易看出,网页Page1的出链有4个,网页Page1的入链有2个。
用拓扑图来描述网页之间的关系,复杂交错的链接构建了一个庞大的互联系统,简称为“互联网”。
一个网页的影响力是所有入链集合的网页影响力加权之和,用公式可以表示为:
P
R
(
u
)
=
∑
v
→
P
u
v
P
R
(
v
)
L
(
v
)
PR(u) = \sum_{v\rightarrow P_{u}}^{v}{\frac{PR(v)}{L(v)}}
PR(u)=v→Pu∑vL(v)PR(v)
注释: L(v) 表示 Pv页面跳出链接的个数,页面跳出的概率就是网页输出自身影响里的权重。
根据PR公式,基于M和初始网页影响力W矩阵,可以计算出W1的个页面影响力:
同样在新的W1的基础上,我们可以迭代计算出W2,W3…, 不断的迭代计算使PageRank充满生命力。
但是并不是所有网页都有跳出链接,并不是所有页面都有跳入链接,这两种情况给简单的PageRank算法带来了两个问题:
一是等级泄漏:一个网页没有出链,就像黑洞吸收其他网页带来的影响力而不释放,造成互联网整理影响力的损失漏出。二是等级沉默:一个网页只有出链,没有入链,不不断的PR迭代后,导致页面的PR影响力为0。
为了在一定程度上解决这两个问题,PageRank引入了阻尼系数的概念,即来表示存在用户直接输入网页地址访问页面的情况即没有出链和入链的网页一样有被访问的概率。不过这个概率一般很小,阻尼系数的d一般等于0.15。
P R ( u ) = 1 − d N + d ∑ v → P u v P R ( v ) L ( v ) PR(u) =\frac{1-d}{N} +d \sum_{v\rightarrow P_{u}}^{v}{\frac{PR(v)}{L(v)}} PR(u)=N1−d+dv→Pu∑vL(v)PR(v)
Page Rank的应用场景很广,存在网络关系的地方,都可以用Page Rank来描述事物之间的关系,继而更好的认识世界。
3,Python绘图表达PR:利用Py可以简单明了的绘制网页的网络关系同时通过节点的大小来呈现各网页的影响力。
import networkx as nx
import matplotlib.pyplot as plt
G=nx.DiGraph()PL ={'P1':['P2','P3','P4','P5'],
'P2':['P1','P5'],'P3':['P3'], 'P4':['P1','P3','P5'],'P5':['P2','P3','P4']}
#绘制带权边
for k,v in PL.items():
for i in v:
G.add_edge(k, i, weight=0.2)
pos=nx.spring_layout(G)
#首先画出节点位置
nx.draw_networkx_nodes(G,pos,node_size=800)
nx.draw_networkx(G, pos=pos,
nodelist=["P2", "P5"], node_size=1800,
node_color='#fad0c4', font_size=15, width=1)
plt.axis('off') plt.savefig("weighted_graph.png")