2

私はNetworkXライブラリを使用して、Web 2.0サイトの使用状況を表す中小規模の重み付けされていない、署名されていない有向グラフを操作しています(最小のグラフ:20ノード未満、最大:数千)。私が計算したいことの1つは、次のような固有ベクトルの中心性です。

>>> eig = networkx.eigenvector_centrality(my_graph)
>>> eigs = [(v,k) for k,v in eig.iteritems()]
>>> eigs.sort()
>>> eigs.reverse() 

ただし、これにより予期しない結果が得られます。アウトディグリーが0であるが、非常に中央のノードから内向きのアークを受信するノードは、リストの最後に0.0の固有ベクトル中心性で表示されます(数学者ではないため、これは混乱しているかもしれませんが、私はそうは思いません外向きの弧は、有向グラフに対するノードの中心性に何らかの違いをもたらすはずです)。これらの結果を調査する過程で、NetworkXがデフォルトで「正しい」固有ベクトルの中心性を計算することにドキュメントから気づきました。好奇心から、推奨される方法で「左」の固有ベクトルの中心性を計算することにしました。つまり、固有ベクトルの中心性を計算する前にグラフを逆にします(Networkxのドキュメントを参照)。)。驚いたことに、まったく同じ結果が得られました。すべてのノードは、以前とまったく同じ固有ベクトルの中心性を持つように計算されました。これは非常にありそうもない結果になるはずだと思いますが(ウィキペディアの記事を参照)、それ以来、私が使用しているすべてのグラフでそれを複製しました。誰かが私が間違っていることを私に説明できますか?

NB PageRankアルゴリズムのNetworkX実装を使用すると、期待した結果が得られます。つまり、非常に中央のノードから内向きのアークを受信するノードは、アウトディグリーが0であっても、高い中心性を持ちます。Pag​​eRankは通常、固有ベクトルの中心性の変形と見なされます(Wikipediaの記事を参照)。 )。

編集:Aricからのリクエストに続いて、いくつかのデータを含めました。これは私の最小のグラフの匿名バージョンです。(問題がグラフの構造に固有である場合、おもちゃのデータを投稿できませんでした。)以下のコードを私のマシン(Python 2.7を使用)で実行すると、(a)各ノードの左右の固有ベクトルの中心性が同じであり、(b)アウトディグリーが0のノードは、グラフ全体の中心にある場合でも、常に固有ベクトルの中心性が0になります(ノード61など)。

import networkx

anon_e_list = [(10, 59), (10, 15), (10, 61), (15, 32), (16, 31), (16, 0), (16, 37), (16, 54), (16, 45), (16, 56), (16, 10), (16, 8), (16, 36), (16, 24), (16, 30), (18, 34), (18, 36), (18, 30), (19, 1), (19, 3), (19, 51), (19, 21), (19, 40), (19, 41), (19, 30), (19, 14), (19, 61), (21, 64), (26, 1), (31, 1), (31, 3), (31, 51), (31, 62), (31, 33), (31, 40), (31, 23), (31, 30), (31, 18), (31, 13), (31, 46), (31, 61), (32, 3), (32, 2), (32, 33), (32, 6), (32, 7), (32, 9), (32, 15), (32, 17), (32, 18), (32, 23), (32, 30), (32, 5), (32, 27), (32, 34), (32, 35), (32, 38), (32, 40), (32, 42), (32, 43), (32, 46), (32, 47), (32, 62), (32, 56), (32, 57), (32, 59), (32, 64), (32, 61), (33, 0), (33, 31), (33, 2), (33, 7), (33, 9), (33, 10), (33, 12), (33, 64), (33, 14), (33, 46), (33, 16), (33, 17), (33, 18), (33, 19), (33, 20), (33, 21), (33, 22), (33, 23), (33, 30), (33, 26), (33, 28), (33, 11), (33, 34), (33, 32), (33, 35), (33, 37), (33, 38), (33, 39), (33, 41), (33, 43), (33, 45), (33, 24), (33, 47), (33, 48), (33, 49), (33, 58), (33, 62), (33, 53), (33, 54), (33, 55), (33, 60), (33, 57), (33, 59), (33, 5), (33, 52), (33, 63), (33, 61), (34, 58), (34, 4), (34, 33), (34, 20), (34, 55), (34, 28), (34, 11), (34, 64), (35, 18), (35, 60), (35, 61), (37, 34), (37, 48), (37, 49), (37, 18), (37, 33), (37, 39), (37, 21), (37, 42), (37, 26), (37, 59), (37, 44), (37, 12), (37, 11), (37, 61), (41, 3), (41, 50), (41, 18), (41, 52), (41, 33), (41, 54), (41, 19), (41, 22), (41, 5), (41, 46), (41, 25), (41, 44), (41, 13), (41, 62), (41, 29), (44, 32), (44, 3), (44, 18), (44, 33), (44, 40), (44, 41), (44, 30), (44, 23), (44, 61), (50, 17), (50, 37), (50, 62), (50, 41), (50, 25), (50, 43), (50, 27), (50, 28), (50, 29), (54, 33), (54, 41), (54, 10), (54, 59), (54, 63), (54, 61), (58, 62), (58, 46), (59, 31), (59, 34), (59, 30), (59, 49), (59, 18), (59, 33), (59, 9), (59, 10), (59, 8), (59, 13), (59, 24), (59, 61), (60, 34), (60, 16), (60, 35), (60, 50), (60, 4), (60, 6), (60, 59), (60, 24), (63, 40), (63, 33), (63, 30), (63, 61), (63, 53)]

my_graph = networkx.DiGraph()
my_graph.add_edges_from(anon_e_list)
r_eig = networkx.eigenvector_centrality(my_graph)
my_graph2 = my_graph.reverse()
l_eig = networkx.eigenvector_centrality(my_graph2)

for nd in my_graph.nodes():
    print 'node: {} indegree: {} outdegree: {} right eig: {} left eig: {}'.format(nd,my_graph.in_degree(nd),my_graph.out_degree(nd),r_eig[nd],l_eig[nd])
4

1 に答える 1

4

これらの2行

my_graph2 = my_graph.copy()
my_graph2.reverse()

に置き換える必要があります

my_graph2 = my_graph.reverse()

reverse()メソッドはデフォルトでグラフのコピーを返すためです。

于 2013-01-31T13:46:10.923 に答える