【问题标题】:Betweenness centrality in NetworkX: logical errorNetworkX 中的中介中心性:逻辑错误
【发布时间】:2016-03-25 21:27:10
【问题描述】:

我通过以下方式计算佛罗伦萨家庭图的中介中心性:

import networkx as nx

# build up a graph
G = nx.florentine_families_graph()
bw_centrality = nx.betweenness_centrality(G, normalized=False)

摘自networkx中betweenness_centrality(...)的描述,

节点v的中心性是通过v的所有对最短路径的分数之和:

因此,中介中心性应该小于1。但是,我得到了结果:(红色节点'Medici'的中介中心性是47.5


我计算介数中心性的方法如下,

node_and_times = dict.fromkeys(G.nodes(), 0) # a dict of node : the number of shortest path passing through node
sum_paths = 0

for s, t in itertools.product(G.nodes(), repeat=2): # all pair of nodes <s, t>
    paths = nx.all_shortest_paths(G, s, t) # generator of lists
    for path in paths:
        sum_paths += 1

        # stats nodes passing through shortest path
        for node in path[1:-1]: # intermediate nodes
            node_and_times[node] += 1

bw_centrality = {k : v*1.0/sum_paths for k, v in node_and_times.items()}

我得到了以下结果,

我说的对吗?


正如回答者所说,删除normalized=False得到以下结果,这与我的计算不一致。

【问题讨论】:

  • '正如回答者所说,删除 normalized=False 得到以下结果,这与我的计算不一致。' - 那是因为你的计算是错误的,你没有计算中介中心性。
  • @TonyBabarino 你是对的。我误解了中介中心性的定义为the number of shortest paths passing through vthe total number of shortest paths 的比率。
  • 是的,没错。我试图在我的答案中解释如何计算它,我希望你能理解我的解释。干杯!

标签: python networkx


【解决方案1】:

介数中心性的定义并不意味着它的值小于1。分数之和不必小于1。

考虑以下示例:

最短路径和它们经过的节点是:

A -> B: None
A -> C: B
A -> D: B, C
A -> E: B, C, D
B -> C: None
B -> D: C
B -> E: C, D
C -> D: None
C -> E: D
D -> E: None

因此从formula 计算“B”的介数中心性:

我们得到:

shortest paths A -> C that go through B = 1
shortest paths A -> C = 1
shortest paths A -> D that go through B = 1
shortest paths A -> D = 1
shortest paths A -> E that go through B = 1
shortest paths A -> E = 1
1/1 + 1/1 + 1/1 = 3

因此所有节点的中介中心性:

A: 0
B: 3
C: 4
D: 3
E: 0

并用 Python 计算:

import networkx as nx

# build up a graph
G = nx.Graph()
G.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
G.add_edges_from([('A', 'B'), ('B','C'), ('C', 'D'), ('D', 'E')])
bw_centrality = nx.betweenness_centrality(G, normalized=False)

print bw_centrality
# returns {'A': 0.0, 'C': 4.0, 'B': 3.0, 'E': 0.0, 'D': 3.0}

所以,如果你想得到小于 1 的值,你必须使用normalized=True (wiki about normalization)。

示例取自here

【讨论】:

  • 抱歉对定义有误解,感谢您的精彩解释。
【解决方案2】:

答案在于“规范化 = False”这一论点。删除它,你会得到小于 1 的值。

【讨论】:

  • 虽然设置normalized=True,但结果与我的计算不符。
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多