最近用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基本建圖、添加節點、邊