2016-03-25 18 views
4

iをフィレンツェの家族グラフ用間隔度中心性計算:ノードvのnetworkxにおけるbetweenness_centrality(...)の説明から媒介中心:論理エラー

import networkx as nx 

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

抜粋、

媒介中心でありますvを通過する全対最短経路の割合の和:

したがって、betweenness centr alityは1より小さくする必要があります。しかし、私は結果を得た:(赤ノードの媒介中心、メディチ '、47.5ある)

enter image description here


Iは次のように媒介中心が計算方法を、

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()} 

と私は、次の結果を得た、

enter image description here

私はそうですか? normalized=Falseを削除


回答で述べたように、私の計算と一致しない、次の結果を得ました。

enter image description here

+1

'answerersで述べたように、normalized = Falseを削除すると、計算結果と一致しない次の結果が得られました。あなたの計算が間違っているので、それは間の重心を計算していません。 –

+0

@TonyBabarinoあなたは正しいです。私は、「最短経路の総数」に対する「vを通る最短経路の数」の比率としての中間度の定義を誤解しています。 – SparkAndShine

+1

まあまあです。私は答えでそれを計算する方法を説明しようとした、私はあなたが私の説明を理解することを願っています。乾杯! –

答えて

2

中間度の定義は、値が1未満であることを意味しません。端数の合計は1未満である必要はありません。

最短経路とそれらが通過するノードである enter image description here

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 

だからから「B」の媒介中心を算出

は、次の例を考えてみ3210:

enter image description here

は、我々が得る:

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=Truewiki about normalization)を使用する必要があります。

例はhereです。

+1

申し訳ありませんが定義を誤解し、あなたの素敵な説明のためにありがとう。 – SparkAndShine

2

答えは "正規化= False" に引数です。それを取り除くと、1より小さい値が得られます。

+0

'normalized = True'に設定しても、結果は私の計算で構成されません。 – SparkAndShine