图算法-PageRank

PageRank最早出自1998年的论文《The Anatomy of a Large-Scale Hypertextual Web Search Engine》,最早是google用于进行网页排序的算法,在其他很多领域也都有应用,比如在NLP里TextRank用它来提取关键字,还有人称它是最伟大的算法之一。

PageRank是一种应用于有向图的迭代算法,节点 p i p_i piPageRank分数计算公式如下:
P R ( p i ) = 1 − d N + d ∑ p j ∈ M ( p i ) P R ( p j ) L ( p j ) PR(p_i) = \frac{1-d}{N} + d \sum_{p_j \in M(p_i)} \frac{PR(p_j)}{L(p_j)} PR(pi)=N1d+dpjM(pi)L(pj)PR(pj)
上式中,N是图中的节点个数, M ( p i ) M(p_i) M(pi)是指向节点 p i p_i pi的节点集合, L ( p j ) L(p_j) L(pj)是节点 p j p_j pj对应的出边数目。d是阻尼因子(damping factor),意味着在每一步有d的概率从节点i的入边跳转到i,有(1-d)的概率随机跳转到网络中的任一节点,通常d会取0.85。

PageRank初始化时,每一个节点的PageRank是相等的都为 1 N \frac{1}{N} N1,在每一轮迭代中,按上式依次计算每一个节点的PageRank分数,当两次迭代PageRank分数变化小于指定阈值或者达到最大迭代次数时,停止迭代。

带权图的PageRank分数计算如下( w j i w_{ji} wji是节点i与j之间的权重, O ( p j ) O(p_j) O(pj)是节点j的出边另一端的节点):
P R ( p i ) = 1 − d N + d ∑ p j ∈ M ( p i ) w j i ∑ k ∈ O ( p j ) w j k P R ( p j ) PR(p_i) = \frac{1-d}{N} + d \sum_{p_j \in M(p_i)} \frac{w_{ji}}{\sum_{k \in O(p_j)}w_{jk} } PR(p_j) PR(pi)=N1d+dpjM(pi)kO(pj)wjkwjiPR(pj)
个性化PageRank(personalized PageRank, PPR)与普通PageRank的区别是计算节点i的pagerank分数时,以(1-d)概率跳转到其他节点时,不再随机跳到图中任一节点,而且按照一定的偏好概率来跳转,用公式表示如下:
P R ( p i ) = ( 1 − d ) u + d ∑ p j ∈ M ( p i ) P R ( p j ) L ( p j ) PR(p_i) = (1-d)u + d \sum_{p_j \in M(p_i)} \frac{PR(p_j)}{L(p_j)} PR(pi)=(1d)u+dpjM(pi)L(pj)PR(pj)
上式中的 u u u是图中每个节点被选择的概率,其和为1。比如如果N = 5,只对第一个和第三个感兴趣,则u=[0.5,0,0.5,0,0]。初始化时,可以定义每个节点的分数,如果不一定则每个节点的分数都为1/N。

使用networkx计算PageRank

import networkx as nx

G = nx.DiGraph()
[G.add_node(k) for k in [1,2,3,4]]
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,1)
G.add_edge(4,3)

pr = nx.pagerank(G)
print(pr)
# {1: 0.32021321825822335, 2: 0.3096812355194899, 3: 0.33260554622228633, 4: 0.037500000000000006}
## 指定偏好
ppr1 = nx.pagerank(G, personalization={1:0.5, 2:0.5, 3:0, 4:0})
print(ppr1)
# {1: 0.3347906675915683, 2: 0.35957180344741185, 3: 0.30563752896102, 4: 0.0}

参考资料

  1. https://nlp.stanford.edu/projects/pagerank.shtml

  2. pagerank的spark实现:spark graphx, spark-pagerank(实现了带权图的pagerank)

  3. pagerank的wikipedia

  4. networkx实现的pagerank

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值