我正在使用networkx计算特征向量中心度。问题是它花费的时间太长(已经运行了大约6个小时)。 有没有更快的方法来获得结果?
图中大约有200,000个节点和60,000,000个边。
答案 0 :(得分:2)
通过查看源代码,networkx.algorithms.centrality.eigenvector
使用幂方法来找到前导特征向量。
如果您坚持使用networkx
,请按照Joel的说明使用:
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的计算,并进行一点点额外处理。