Python 使用networkx计算特征向量中心度

Python 使用networkx计算特征向量中心度,python,networkx,eigenvector,Python,Networkx,Eigenvector,我试图使用networkx计算我的图形的特征向量中心: import networkx as nx import pandas as pd import numpy as np a = nx.eigenvector_centrality(my_graph) 但我得到了一个错误: NetworkXError: eigenvector_centrality(): power iteration failed to converge in %d iterations."%(i+1)) 我的图表有

我试图使用networkx计算我的图形的特征向量中心:

import networkx as nx
import pandas as pd
import numpy as np

a = nx.eigenvector_centrality(my_graph)
但我得到了一个错误:

NetworkXError: eigenvector_centrality():
power iteration failed to converge in %d iterations."%(i+1))
我的图表有什么问题


TL/DR:try
nx.特征向量\u中心性\u numpy


下面是发生的事情
nx。特征向量的中心性
依赖于幂迭代。它所采取的行动相当于将一个向量与同一个矩阵重复相乘(然后对结果进行规格化)。这通常收敛到最大特征向量。但是,当存在具有相同(最大)量级的多个特征值时,将失败

你的图是星图。星图有多个“最大”特征值。对于只有两个“外围节点”的星形,您可以轻松检查
sqrt(2)
-sqrt(2)
都是特征值。更一般地说,
sqrt(N)
-sqrt(N)
都是特征值,其他特征值的幅值较小。我相信,对于任何二部网络,,这都会发生,标准算法也会失败

数学上的原因是,经过n轮迭代后,解看起来像是c_i lambda_i^n v_i/K_n的和,其中c_i是一个常数,取决于初始猜测,lambda_i是第i个特征值,v_i是其特征向量,K是一个归一化因子(应用于和中的所有项)。当存在显性特征值时,lambda_i^n/K_n对于显性特征值变为非零常数,对于其他特征值变为0

然而,在你的例子中,你有两个同样大的特征值。较小特征值的贡献仍然为零。但剩下的是(c_1 lambda_1^n v_1+c_2 lambda_2^n v_2)/K_n。这不会收敛,因为lambda_2为负值。每次迭代时,从v_2的某个倍数相加到减去该倍数

因此networkx使用的简单的
特征值中心性
将不起作用。您可以改为使用
nx.eigenvector\u centrality\u numpy
,以便使用numpy


注意:通过快速查看文档,我不能100%肯定numpy算法保证是最大(正)特征值。它使用numpy算法来找到一个特征向量,但我在文档中没有看到它是主导特征向量的保证。大多数寻找单一特征向量的算法都会得到占主导地位的特征向量,所以你可能没问题

我们可以在其中添加一张支票:

  • 只要
    nx.特征向量_centrality_numpy
    返回所有正值,Perron-Frobenius定理保证这对应于最大特征值
  • 如果有些是零,那么要确定它会变得有点棘手
  • 如果有些是负的,那么它不是主特征向量

您的图形可能为空,这表示未创建边和顶点。检查输入的图表,看看它是否遵循正确的格式,或者它是否是empy。3年后。。。我对
特征向量\u中心性\u numpy
有过奇怪的经历。在我举的一个小例子中,它返回了
1E-11附近的一些值和一个负值,而
eignvector\u centrality
返回了更合理的中心值(基于我的期望),并且所有值都是正值(最小值约为
1E-3
)。如果你能在一个新问题中发布这个例子,我可能会看到它(由于我的工作是研究传染病控制,目前我的时间非常有限)。听起来好像没有找到正确的特征值(如果某些值为负值)。谢谢!是的。