python-3.x - 特征向量中心性numpy的不同结果
问题描述
以下示例给出了使用eigenvector_centrality
和获得的不同结果eigenvector_centrality_numpy
。有没有办法让这种计算更加稳健?我正在使用networkx 2.4
,numpy 1.18.5
和scipy 1.5.0
.
import numpy as np
import networkx as nx
AdjacencyMatrix = {
0: {
1: 0.6,
},
1: {
2: 0,
3: 0,
},
2: {
4: 0.5,
5: 0.5,
},
3: {
6: 0.5,
7: 0.5,
8: 0.5,
},
4: {},
5: {},
6: {},
7: {},
8: {},
}
G = nx.DiGraph()
for nodeID in AdjacencyMatrix.keys():
G.add_node(nodeID)
for k1 in AdjacencyMatrix.keys():
for k2 in AdjacencyMatrix[k1]:
weight = AdjacencyMatrix[k1][k2]
split_factor = len(AdjacencyMatrix[k1])
G.add_edge(k1, k2, weight=weight / split_factor, reciprocal=1.0 / (split_factor * weight) if weight != 0 else np.inf)
eigenvector_centrality = {v[0]: v[1] for v in sorted(nx.eigenvector_centrality(G.reverse() if G.is_directed() else G, max_iter=10000, weight="weight").items(), key=lambda x: x[1], reverse=True)}
print(eigenvector_centrality)
eigenvector_centrality_numpy = {v[0]: v[1] for v in sorted(nx.eigenvector_centrality_numpy(G.reverse() if G.is_directed() else G, max_iter=10000, weight="weight").items(), key=lambda x: x[1], reverse=True)}
print(eigenvector_centrality_numpy)
这是我的输出:
{0: 0.6468489798823026, 3: 0.5392481399595738, 2: 0.5392481399595732, 1: 0.0012439403459275048, 4: 0.0012439403459275048, 5: 0.0012439403459275048, 6: 0.0012439403459275048, 7: 0.0012439403459275048, 8: 0.0012439403459275048}
{3: 0.9637027924175013, 0: 0.0031436862826891288, 6: 9.593026373266866e-11, 8: 3.5132785569658154e-11, 4: 1.2627565659784068e-11, 1: 9.433263632036004e-14, 7: -2.6958851817582286e-11, 5: -3.185304797703736e-11, 2: -0.26695888283266833}
解决方案
编辑- 查看 dshult 的回复。他是维护/更新的主要人员之一networkx
。
我认为这可能是一个错误,但不是你想的那样。该图是有向图和非循环图。所以对于这张图,我认为不存在非零特征值。
看起来该算法似乎隐含地假设了一个无向图,或者至少如果它是有向的,它就有循环。如果没有循环,我希望算法会中断。
我将鼓励 networkx 的人们更详细地研究这一点。
我真的很惊讶它会收敛到非 numpy 版本。
推荐阅读
- javascript - 有没有办法在 Node.js/Express Web 应用程序中嵌套多个函数作为回调来实现顺序处理?
- safari - 为什么在调用 rtcPeerConnection.createOffer() 之后,Safari iOS 上的报价为空?
- javascript - 重启后如何使机器人注册反应
- vba - 如何滚动到 MS Word 中编号列表中的特定数字
- python - 如何在 Revit API 中从 C# code.where(...) 转换为 python
- c - Vulkan - 飞行中的多个帧
- azure - Azure AD B2C - 在浏览器关闭/重新打开之间维护 OTP
- markdown - Jekyll 不在子目录中生成 index.html
- flutter - 来自 AndroidManifest.xml:17:9-28 的属性 application@label value=(AOL)
- redux - 使用 1 个调度操作/reducer 调用更新 2 个 Redux Store 属性?(React-Redux)