def pagerank(node2nodes_out, node2nodes_in, alpha=0.85, min_delta=0.00001):
pr = {node: 1/len(node2nodes_out) for node in node2nodes_out} # 初始化
print(pr)
for i in range(100):
change = 0
for node in node2nodes_in:
nodes_in = node2nodes_in[node]
rank = 0
for node_in in nodes_in:
rank += pr[node_in] / len(node2nodes_out[node_in])
rank = rank * alpha
rank += (1 - alpha) / len(node2nodes_out)
change += abs(pr[node] - rank)
pr[node] = rank
if change < min_delta:
print(i, pr)
if __name__ == '__main__':
node2nodes_out = {
'A': ['B', 'C'],
'B': ['C'],
'C': ['A'],
}
node2nodes_in = {
'A': ['C'],
'B': ['A'],
'C': ['A', 'B']
}
alpha = 0.85
## 根據實際需求,實要求得以出度多的爲關鍵的網絡,將out和in交換位置就可以了。
pagerank(node2nodes_out, node2nodes_in, alpha)
pagerank核心就是爲了找到網絡中被以來最多的那個人,越受依賴就越重要。
其中node2nodes_out 中,key爲當前點,value爲當前點出鏈指向的點。node2nodes_in表示的是入鏈的點。
pagerank的算法很簡單,不過其原理和有效性,有極限性還是比較複雜的,感興趣的小夥伴可以查閱以下資料。
引用
1. pagerank的博客解說:https://www.cnblogs.com/rubinorth/p/5799848.html
2. pagerank論文:http://ilpubs.stanford.edu:8090/422/1/1999-66.pdf