二分中心性的权重?
Weights in bipartite betweenness centrality?
我正在使用 python 和 networkx 来模拟哪个说话者在对话中提到哪个项目。为此,我想构建一个二分图,其中一组节点代表说话者,另一组节点代表项目。从这张图中,我想计算一些中心性度量,例如中介中心性。我还想将每条边的权重作为参数传递,其中权重表示说话者提及某个项目的频率。但是,双向实现不允许我将权重作为参数传递。
这些实现之间有什么区别,我应该使用哪一个来为我的问题建模?
import networkx as nx
from networkx.algorithms import bipartite
speakers = ['Pink', 'Green']
items = ['Knife', 'Rope']
B = nx.Graph()
B.add_nodes_from(items, bipartite = 0)
B.add_nodes_from(speakers, bipartite = 1)
B.add_edge('Pink', 'Knife', weight = 10)
B.add_edge('Pink', 'Rope', weight = 4)
B.add_edge('Green', 'Rope', weight = 2)
B.add_edge('Green', 'Knife', weight = 7)
bottom_nodes, top_nodes = bipartite.sets(B)
print(nx.is_bipartite(B))
print(bipartite.betweenness_centrality(B, bottom_nodes))
print(nx.betweenness_centrality(B))
print(nx.betweenness_centrality(B, weight = 'weight'))
我得到以下输出:
True
{'Knife': 0.25, 'Rope': 0.25, 'Pink': 0.25, 'Green': 0.25}
{'Knife': 0.16666666666666666, 'Rope': 0.16666666666666666, 'Pink': 0.16666666666666666, 'Green': 0.16666666666666666}
{'Knife': 0.0, 'Rope': 0.3333333333333333, 'Pink': 0.0, 'Green': 0.3333333333333333}
我希望结果是一样的;那么在实现上有什么不同呢?
二分介数中心性documentation中有解释
Betweenness centrality of a node v
is the sum of the fraction of all-pairs shortest paths that pass through v
.
Values of betweenness are normalized by the maximum possible value which for bipartite graphs is limited by the relative size of the two node sets
文档继续描述归一化因子。
实际上,如果您检查 source code 的介数版本,它会直接调用无向介数中心性代码,然后应用额外的归一化因子。因此,存在二分版本的唯一原因是您可以对它们进行不同的标准化。
目前没有在二分版本中包含权重的选项。但是,如果您查看源代码,就不难包含它。如果你这样做,你应该考虑到底应该如何做才能捕捉到你试图解释的任何过程。这意味着您应该了解规范化是如何得出的。否则,我会坚持使用非二分版本,并确保您认识到比较不同组件中节点的中心性是不好的。
我正在使用 python 和 networkx 来模拟哪个说话者在对话中提到哪个项目。为此,我想构建一个二分图,其中一组节点代表说话者,另一组节点代表项目。从这张图中,我想计算一些中心性度量,例如中介中心性。我还想将每条边的权重作为参数传递,其中权重表示说话者提及某个项目的频率。但是,双向实现不允许我将权重作为参数传递。
这些实现之间有什么区别,我应该使用哪一个来为我的问题建模?
import networkx as nx
from networkx.algorithms import bipartite
speakers = ['Pink', 'Green']
items = ['Knife', 'Rope']
B = nx.Graph()
B.add_nodes_from(items, bipartite = 0)
B.add_nodes_from(speakers, bipartite = 1)
B.add_edge('Pink', 'Knife', weight = 10)
B.add_edge('Pink', 'Rope', weight = 4)
B.add_edge('Green', 'Rope', weight = 2)
B.add_edge('Green', 'Knife', weight = 7)
bottom_nodes, top_nodes = bipartite.sets(B)
print(nx.is_bipartite(B))
print(bipartite.betweenness_centrality(B, bottom_nodes))
print(nx.betweenness_centrality(B))
print(nx.betweenness_centrality(B, weight = 'weight'))
我得到以下输出:
True
{'Knife': 0.25, 'Rope': 0.25, 'Pink': 0.25, 'Green': 0.25}
{'Knife': 0.16666666666666666, 'Rope': 0.16666666666666666, 'Pink': 0.16666666666666666, 'Green': 0.16666666666666666}
{'Knife': 0.0, 'Rope': 0.3333333333333333, 'Pink': 0.0, 'Green': 0.3333333333333333}
我希望结果是一样的;那么在实现上有什么不同呢?
二分介数中心性documentation中有解释
Betweenness centrality of a node
v
is the sum of the fraction of all-pairs shortest paths that pass throughv
.Values of betweenness are normalized by the maximum possible value which for bipartite graphs is limited by the relative size of the two node sets
文档继续描述归一化因子。
实际上,如果您检查 source code 的介数版本,它会直接调用无向介数中心性代码,然后应用额外的归一化因子。因此,存在二分版本的唯一原因是您可以对它们进行不同的标准化。
目前没有在二分版本中包含权重的选项。但是,如果您查看源代码,就不难包含它。如果你这样做,你应该考虑到底应该如何做才能捕捉到你试图解释的任何过程。这意味着您应该了解规范化是如何得出的。否则,我会坚持使用非二分版本,并确保您认识到比较不同组件中节点的中心性是不好的。