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
然而,通过运行下面的代码(我使用G1
和G2
作为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 betweenness
和 edge 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
显然,使用 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
然而,通过运行下面的代码(我使用G1
和G2
作为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 betweenness
和 edge 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