TL / DR:中間中心性の計算は非常に遅いため、myk
のサブセットを考慮して概算を使用することをお勧めします。 myk
があるノード はネットワーク内のノードの数よりもはるかに少ない数ですが、統計的に意味のある大きさです(NetworkXにはこのオプションがあります:betweenness_centrality(G, k=myk)
。
時間がかかるのも驚きではありません。中間中心性は計算が遅いです。 networkxで使用されるアルゴリズムはO(VE)
です。 ここで、V
は頂点の数であり、E
エッジの数。あなたの場合、VE = 10^13
。グラフのインポートにはO(V+E)
が必要です。 時間なので、それが瞬間的ではないとわかるほど時間がかかる場合は、O(VE)
苦痛になりそうです。
ノードの1%とエッジの1%(つまり、20,000ノードと50,000エッジ)の縮小されたネットワークに時間Xがかかる場合、目的の計算には10000Xがかかります。 Xが1秒の場合、新しい計算は3時間に近くなります。これは、非常に楽観的だと思います(以下の私のテストを参照)。したがって、コードに問題があると判断する前に、いくつかの小規模なネットワークでコードを実行し、ネットワークの実行時間の見積もりを取得してください。
良い代替策は、おおよその尺度を使用することです。標準の中間性測定では、ノードのすべてのペアとそれらの間のパスが考慮されます。 Networkxは、k
のランダムサンプルを使用する代替手段を提供します ノードを検索し、それらのk
間の最短パスを見つけます ネットワーク内のノードおよび他のすべてのノード。これにより、O(kE)
での実行が高速化されるはずです。 時間
つまり、使用するのは
betweenness_centrality(G, k=k)
結果の精度を制限したい場合は、k
の小さい値で複数の呼び出しを行うことができます。 、それらが比較的近いことを確認してから、平均的な結果を取得します。
(V、E)=(20,50);のランダムグラフを使用した、実行時間の簡単なテストの一部を次に示します。 (200,500);および(2000,5000)
import time
for n in [20,200,2000]:
G=nx.fast_gnp_random_graph(n, 5./n)
current_time = time.time()
a=nx.betweenness_centrality(G)
print time.time()-current_time
>0.00247192382812
>0.133368968964
>15.5196769238
したがって、私のコンピューターでは、自分のサイズの0.1%のネットワークを処理するのに15秒かかります。同じサイズのネットワークを作成するには、約1,500万秒かかります。これは1.5*10 ^ 7秒で、pi * 10^7秒の半分弱です。 pi * 10 ^ 7秒は、1年の秒数の非常に良い概算であるため、これには約6か月かかります。
したがって、近似アルゴリズムを使用して実行する必要があります。