python中心性评价_python – 使用networkx计算特征向量中心性

TL / DR:尝试nx.eigenvector_centrality_numpy.

这是正在发生的事情:nx.eigenvector_centrality依赖于功率迭代.它所采取的动作相当于将矢量重复乘以相同的矩阵(然后对结果进行归一化).这通常会收敛到最大的特征向量.然而,当存在具有相同(最大)幅度的多个特征值时,它失败.

您的图表是星图.星图有多个“最大”特征值.对于只有两个“外围节点”的星型,您可以轻松检查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_centrality_numpy以便使用numpy.

注意:通过快速浏览文档,我不是100%肯定numpy算法保证是最大(正)特征值.它使用numpy算法来寻找特征向量,但我没有在文档中看到它保证它是主要的特征向量.大多数用于查找单个特征向量的算法都会产生显性特征向量,因此您可能没问题.

我们可以添加一个检查:

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

你可能感兴趣的:(python中心性评价)