在Networkx中快速计算本征向量中心性花费的时间太长

时间:2019-06-21 16:46:33

标签: python networkx igraph eigenvector

我正在使用networkx计算特征向量中心度。问题是它花费的时间太长(已经运行了大约6个小时)。 有没有更快的方法来获得结果?

图中大约有200,000个节点和60,000,000个边。

2 个答案:

答案 0 :(得分:2)

通过查看源代码,networkx.algorithms.centrality.eigenvector使用幂方法来找到前导特征向量。

如果您坚持使用networkx,请按照Joel的说明使用:

eigenvector_centrality_numpy

centrality = nx.eigenvector_centrality_numpy(G)

或者:

您可以使用使用ARPACK的scipy.sparse.linalg.eigs并仅请求返回1个特征向量。

玩具示例:

import scipy.sparse as sparse

X = np.array() # dimensions 200000 by 200000 as the adjacency
# Note: k=1 and you request the Largest real.
vals, vecs = sparse.linalg.eigs(X, k=1, which='LR')

在任何情况下,2000000 x 200000都是很大,并且取决于矩阵的稀疏性和性质,该算法可能会花费很长时间。您还将需要大量的CPU和RAM。

networkx.algorithms.centrality.eigenvector的其他提示:

如果您坚持使用networkx,请尝试放松公差:

eigenvector_centrality(G, max_iter=100, tol=1e-06, nstart=None, weight=None)

尝试设置tol=1e-04甚至tol=1e-03

答案 1 :(得分:1)

尝试使用eigenvector_centrality_numpy。从文档中:

  

该算法使用SciPy稀疏特征值求解器(ARPACK)查找最大特征值/特征向量对。

因此,这将进行serafeim的计算,并进行一点点额外处理。