【问题标题】:Fast calculation of eigenvector centrality takes too long in networkx在networkx中快速计算特征向量中心性需要很长时间
【发布时间】:2019-06-21 16:46:33
【问题描述】:

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

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

【问题讨论】:

  • 是的。但是您需要在networkx之外使用外部模块。无论如何,特征向量的维数将是 200000,所以没关系。
  • @serafeim 外部模块是什么意思?
  • 我的意思是不使用networkx函数来计算领先的特征向量。使用 ARPACK,您可以更快地找到邻接的主要特征向量。你能提供更多信息吗? 200000 个节点代表什么?另外,如果您发布一些数据,我可以发布答案
  • 查看我的回答,回答您的问题并提供圆顶额外的想法
  • Networkx 有一个内置的方法可以更快地完成它。

标签: python networkx igraph eigenvector


【解决方案1】:

通过查看源代码,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

【讨论】:

  • networkx 已经内置了这个eigenvector_centrality_numpy.
【解决方案2】:

尝试使用eigenvector_centrality_numpy。来自文档:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2010-12-22
    相关资源
    最近更新 更多