我在加权的DiGraph上运行PageRank,其中nodes = 61634,edges = 28,378。
pagerank(G)
抛出ZeroDivsionError
pagerank_numpy(G)
抛出ValueError:array to big
pagerank_scipy(G)
通过
我可以理解pagerank_numpy
错误是由于内存限制,但为什么pagerank会失败?我尝试将无穷小的值添加到零权重的边缘,但同样的问题仍然存在。一些指针会很好。
链接到我的GraphML文件 - https://mega.co.nz/#!xlYzEDAI!Lyh5pD-NJL61JPfkrNyJrEm0NnFc586A0MUD8OMYAO0
NetworkX版本 - 1.8.1 Python - 2.7
答案 0 :(得分:3)
@ mtitan8的答案很好,但故事还有一点。
自原始问题的时间以来,NetworkX代码被修改,以便当零或负权重(https://github.com/networkx/networkx/pull/1001)时,pagerank(),pagerank_numpy()和pagerank_scipy()都给出相同的答案
当您具有负权重时,这些函数产生的结果可能不是您想要的(如果它可以工作)。算法现在处理从输入矩阵(图的加权邻接矩阵)中创建“Google Matrix”的方式是行除以行和除非它为零(然后整行设置为零) 。这笔钱可能是负数。
如果结果矩阵仍然以负数条目结束,那么 Perron-Frobenius定理不适用 http://en.wikipedia.org/wiki/Perron%E2%80%93Frobenius_theorem和你 不保证具有唯一的具有正的最大特征值 有价值的特征向量。
答案 1 :(得分:2)
pagerank
失败,因为它使用stochastic_graph
执行计算 - 与pagerank_numpy
或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次迭代后没有收敛,但这是另一个问题。