Networkx 和 Networkit 中的介数错误?

Wrong betweenness in both Networkx and Networkit?

显然,使用 networkx 和 networkit 计算的节点介数和边介数都给出了与预期不同的值。

让我们考虑以下无向图 (pag. 20/85 in these Lecture notes),写为边列表并保存在 mygraph.txt 中:

1 2
1 5
2 3
2 5
3 4
4 5
4 6

节点介数应该是(pag. 20/85 in these Lecture notes):

Node | Betweenness
1 0
2 1.5
3 1
4 4
5 3
6 0

然而,通过运行下面的代码(我使用G1G2作为networkx和networkit中的图的不同名称,但它们是完全相同的图,即将到来来自同一文件 mygraph.txt):

import networkx as nx
from networkit import *  
import networkit as nk 


G1 = nx.read_edgelist("mygraph.txt",create_using=nx.Graph(), nodetype = int)
G1.number_of_nodes()

node_btw = nx.betweenness_centrality(G1, normalized=False)
edge_btw = nx.edge_betweenness_centrality(G1, k=None, normalized=False, weight=None, seed=None)

print('NETWORK-X')
print(node_btw.values())
print(edge_btw.values())


edgeListReader = nk.graphio.EdgeListReader(' ', 1)
G2 = nk.readGraph("/home/JohnRambo/Documents/myFolder/mygraph.txt", nk.Format.EdgeListTabOne)
print(G2.numberOfNodes(), G2.numberOfEdges()) 

G2.indexEdges()
btwn = nk.centrality.Betweenness(G2, normalized=False, computeEdgeCentrality=True)
btwn.run()

print('NETWORK-IT')
print(btwn.scores()[:10])
print(btwn.edgeScores()[:10])

我得到了这些结果(P.S。:我手动添加了文本 node betweennessedge betweenness):

NETWORK-X
node betweenness: [0.0, 1.5, 3.0, 1.0, 4.5, 0.0]
edge betweenness: [2.0, 3.0, 3.5, 2.5, 5.5, 3.5, 5.0]

NETWORK-IT
node betweenness: [0.0, 3.0, 2.0, 9.0, 6.0, 0.0]
edge betweenness: [4.0, 7.0, 7.0, 6.0, 5.0, 11.0, 10.0]

我的计算给出了不同的结果(节点介数分数与 pag. 20/85 in these Lecture notes 中显示的结果一致)

node betweenness: [0.0, 1.5, 1.0, 4.5, 3.0, 0.0]
edge betweenness: [2.0, 3.0, 3.5, 2.5, 3.5, 5.5, 5.0]

能否澄清一下并提出解决此问题的方法?

正如 Kyle 在他的评论中提到的,网络中的节点被添加到 与边缘列表关联的序列。为了解决这个问题,一个简单的 排序将修复它。第三行输出显示实际序列 节点数。

关于边缘,阅读时发生了意想不到的事情 来自文件的边列表:边 (4, 5) 被加载为 (5, 4)。看 第二行输出。这会导致预期的排序顺序 边缘,就像文件一样,是不同的:第六和 第七个节点被交换。

下面的代码按键值对节点介数字典进行排序 (节点号),同时将介数值放入元组中, 在第四行输出。

最后一行显示每条边及其中间值。

import networkx as nx

G1 = nx.read_edgelist("mygraph.txt",create_using=nx.Graph(), nodetype = int)
G1.number_of_nodes()

node_btw = nx.betweenness_centrality(G1, normalized=False)
edge_btw = nx.edge_betweenness_centrality(G1, k=None, normalized=False, weight=None, seed=None)

print('NETWORK-X')
print(tuple(node_btw.keys()))
print(tuple(edge_btw.keys()))
nn_btw = tuple(v for _,v in sorted(node_btw.items(), key=lambda x: x[0]))
print(nn_btw)
en_btw = tuple(v for _,v in sorted(edge_btw.items(), key=lambda x: x[0]))
print(en_btw)
for k,v in sorted(edge_btw.items(),key=lambda x: x[0]):
    print(k, v)

输出:

# NETWORK-X
# (1, 2, 5, 3, 4, 6)
# ((1, 2), (1, 5), (2, 3), (2, 5), (5, 4), (3, 4), (4, 6))
# (0.0, 1.5, 1.0, 4.5, 3.0, 0.0)
# (2.0, 3.0, 3.5, 2.5, 3.5, 5.0, 5.5)
# (1, 2) 2.0
# (1, 5) 3.0
# (2, 3) 3.5
# (2, 5) 2.5
# (3, 4) 3.5
# (4, 6) 5.0
# (5, 4) 5.5