2017-03-27 2 views
2

私は、いわゆるconfiguration_modelアルゴリズムを使って度数分布 の度数分布でサイズNのネットワークを生成しています。結果として得られるグラフは複数のエッジを許容しますが、それらを数える必要がありますが、どのように把握できません。ここでは可能な解決策である:グラフで複数の辺を数える(ファイブ)

import networkx as nx 
import numpy as np 
from networkx.utils import (powerlaw_sequence, create_degree_sequence) 

deg_sequence = create_degree_sequence(num, powerlaw_sequence, exponent=2.2) 
graph=nx.configuration_model(deg_sequence) 

num_par = sum(len(graph[node][neigh]) for node in graph for neigh in graph.neighbors_iter(node)) // 2 
print ('Graph has %d multi-links' %num_par) 

self_loops=len(graph.selfloop_edges()) 
print ('Graph has %d self-loops' %self_loops) 

edges=len(graph.edges()) 
print edges 

私は、インターネット上のどこかのコードの6行を借りたが、率直に言って、私はかなりそれがどのように動作するかを理解することはできません。特に、グラフの長さを計算するグラフ(ノード[ノード])は何かを理解できません。私にとっては、それもリストのようには見えませんが、私はここでその考えを得ていないと確信しています。 このコードの結果、私は複数のエッジの割合が非常に高くなります。リンクの総数の98%以上を占めています。 このように平行なエッジを計算する方法は正しいですか?もしそうなら、あなたはそれがどのように機能するか私に説明しますか?他のやり方を知っていますか?

+0

numにはどのような値がありますか? – Paul

答えて

1

あなたはforループの代わりにリスト式の中でライン6を書き出す場合は、次のように到着:

num_par = 0 
for node in graph: 
    for neigh in graph.neighbors(node): 
     num_par += len(graph[node][neigh])/2. 

私はその行がカウントされるかわからないです。私はそれがマルチエッジの数を正しく計算していないと確信しています。

あなただけの配列(num = 100)としてグラフをプロットした場合、あなたはすぐに非常に少数のマルチエッジがあることがわかります。

​​

enter image description here

マルチエッジの数は、簡単です

num_multiedges = np.sum(arr>=2)/2 # divide by two as graph is undirected 
+0

ポールありがとう、私はまだnumpyに慣れています、これは私が必要としていたものです! BTW私はあなたのようなリストの理解を書き直しました。私もそれが何をしているのか理解できませんでした。それが私が尋ねた理由です。著者はそれがマルチエッジカウンタだと主張しましたが、私が理解していないか、間違っていたコードであるかわかりませんでした。再び、ありがとう。 – sato

+0

ああ、数時間で私を殴った。いい答え! – VMAtm

関連する問題