NetworkX python:pagerank_numpy,pagerank失败但pagerank_scipy工作

时间:2013-11-04 16:27:22

标签: python-2.7 networkx pagerank

我在加权的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

2 个答案:

答案 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_numpypagerank_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次迭代后没有收敛,但这是另一个问题。