pagerank
stochastic_graph
失败,因为它使用--like pagerank_numpy
or执行计算pagerank_scipy
。从文档中,stochastic_graph
需要:
NetworkX 图,必须具有有效的边权重
这个“有效的边缘权重”点(根本没有解释,我认为这是一个错误)是你问题的根源。
对于有向图,stochastic_graph
使用out_degree
每个节点的 对边进行归一化。再次来自文档:
[out] 度是与节点相邻的边权重之和。
因此,当您的边具有零权重或负权重时,规范化过程会以ZeroDivisionError
. 负权重是一个问题的原因是它们可以抵消正权重,从而使节点度数为零。例如,在您的图中,节点'2123271'
有两条边,其权重总和为0
:
>>> G.edges('2123271', data=True)
[('2123271', '1712899', {'weight': -1L}),
('2123271', '890839', {'weight': 1L})]
用小的正边权重替换图表中的负边权或零边权使其pagerank
可以运行:
In [1]: import networkx as nx
In [2]: G = nx.read_graphml("your_graph.graphml")
In [3]: defaultEdgeWeight = 0.01
In [4]: for u, v, d in G.edges(data=True):
if d['weight'] <= 0:
G[u][v]['weight'] = defaultEdgeWeight
In [5]: P = nx.pagerank( G )
当然,pagerank
在 102 次迭代后没有收敛,但这是另一个问题。