python networkx PageRank

最近用Java写了个pagerank,发现最终算出来的PageRank值的和不是1,但是这个和应该是1的,所以就用python的networkx包中的PageRank算法做了一个测试:

import os
import networkx as nx
os.chdir('C:\\Users\\XXX\\Desktop\\')
filename = 'Wiki-Vote.txt'
G=nx.DiGraph()
with open(filename) as file:
    for line in file:
        head, tail = [int(x) for x in line.split()]
        G.add_edge(head,tail)

pr=nx.pagerank(G,alpha=0.85)
x = 0;
for node, value in pr.items():
    x = x + value
print(x)

打印结果是:1.0000000000000004,说明所有节点PageRank值的和确实是1

Wikit-Vote.txt 在这里:http://snap.stanford.edu/data/wiki-Vote.html,用的时候把文件前面的一小段注释删掉了

要注意的一点:G=nx.Graph()构造的是无向图, G=nx.DiGraph()构造的是有向图,要注意区别

还可以将图画出来,下面是一个示例:

import matplotlib.pyplot as plt
import networkx as nx

G=nx.binomial_graph(10, 0.3, directed=True)
layout = nx.spring_layout(G)
plt.figure(1)
nx.draw(G, pos=layout, node_color='y')

pr=nx.pagerank(G,alpha=0.85)
print(pr)
for node, pageRankValue in pr.items():
    print("%d,%.4f" %(node,pageRankValue))

plt.figure(2)
nx.draw(G, pos=layout, node_size=[x * 6000 for x in pr.values()],node_color='m',with_labels=True)
plt.show()

右边的图中节点大小是与其pagerank值成比例的,具体每个节点的pagerank值为:

0,0.1164
1,0.1006
2,0.1251
3,0.1541
4,0.0835
5,0.0835
6,0.0913
7,0.1171
8,0.0746
9,0.0538

http://networkx.github.io/documentation/latest/tutorial/tutorial.html  networkx基本建图、添加节点、边

原文地址:https://www.cnblogs.com/fstang/p/3113352.html