2016-06-24 16 views
0

networkxでグラフを作成し、ほとんどの加重枝の70%を保持し、igraphに変換してcommunity_infomapを使用しました。グラフのラベルは非常に重要です。あなたがcommunity_infomapのグラフと結果を比較すると、奇妙なことが分かります。グラフ上には、2つのコミュニティ信号1,2と第2のグループ3.4.5.6.7.8があることは明らかですが! infomapの後にラベルをつぶすと、シグナル3.2と1.4.5.6.7.8がグループ化されます。なぜ、何が起こる可能性がありますか? infomap graphPython iGraph - community_infomapグラフ

def nlargest_indices_orig(full, n): 
full = full.copy() 
x = np.zeros(n) 
y = np.zeros(n) 

for idx in range(n): 
    x[idx] = np.unravel_index(full.argmax(), full.shape)[0] 
    y[idx] = np.unravel_index(full.argmax(), full.shape)[1] 
    full[full == full.max()] = 0. 

return x, y 

labels=[1,2,3,4,5,6,7,8] 
o1 = scipy.io.loadmat('out.mat') 
X=(o1['out']) 
K=np.zeros((8,8)) 
m, n = np.shape(X) 
G = nx.Graph() 
for i in range(8): 
    for j in range(8): 
     if X[i,j]>0: 
      s=labels[i] 
      b=labels[j] 
      w=X[i,j] 
      G.add_edge(s,b,weight=w) 
B=G.edges() 
ND=len(B) 
print('Grana ukupno') 
procenat=round(0.7*ND) 
x,y=nlargest_indices_orig(X, procenat) 
s1=x 
s2=y 
for i in range(len(s2)): 
    K[s1[i],s2[i]]=X[s1[i],s2[i]] 
np.fill_diagonal(K, 0) 
F = nx.Graph() 

for i in range(8): 
    for j in range(8): 
     if K[i,j]>0: 
      s=labels[i] 
      b=labels[j] 
      w=X[i,j] 
      F.add_edge(s,b,weight=w) 
edgewidth=[] 
edgelabels={} 
pos = nx.spring_layout(F) # position the nodes by force layout 
plt.figure() 
plt.axis('off') 
print('Weighted graph') 
for (u,v,d) in F.edges(data=True): 
    print(u,v,d) 
    edgewidth.append(d['weight']) 
    edgelabels[(u,v)] = d['weight'] 
nx.draw_networkx_edges(F,pos,width=edgewidth,edge_color='r') 
nx.draw_networkx_nodes(F,pos, alpha=0.8, node_size=400,node_color='w',scale=100) 
nx.draw_networkx_labels(F,pos, font_size=12) 
pylab.savefig('Graf--odabrani-sum imf.png') 
plt.show() 
edges = F.edges() 
nodes=F.nodes() 
cg = ig.Graph(edges) 
cg.vs['label'] = labels 
singletons = cg.vs.select(_degree = 0) 
cg.delete_vertices(singletons) 
degree = 0 
community = cg.community_infomap() 
print(len(community)) 
b=ig.plot(community,'infomap-odabrani-sum imf-.png') 

答えて

0

ここで何が起こるかを調べるために、我々はIGRAPHの頂点インデックスの挙動を理解する必要があります。頂点インデックスが安定していない場合、頂点またはエッジの削除または追加時に再インデックスが発生する可能性があります。指数は常に0からn-1になります。整数タプルでグラフを初期化すると、igraphは整数を頂点インデックスとみなします。あなたのインデックスは1から始まるので、igraphはインデックスが0のシングルトンの頂点を導入します。これは元のネットワークにはなかったので完全に間違っています。

import igraph as ig 
import networkx as nx 
import pylab as plt 

_edges = [ 
    (1, 2), 
    (3, 4), (3, 5), (3, 6), (3, 8), 
    (4, 5), (4, 6), (4, 7), (4, 8), 
    (5, 6), (5, 7), (5, 8), 
    (6, 7), (6, 8), 
    (7, 8) 
] 

G = nx.Graph() 

for e in _edges: 
    G.add_edge(e[0], e[1], weight = 1) 

pos = nx.spring_layout(G) 
plt.figure() 
plt.axis('off') 
nx.draw_networkx_edges(G, pos, edge_color='r') 
nx.draw_networkx_nodes(G, pos, alpha=0.8, node_size=400, node_color='w', scale=100) 
nx.draw_networkx_labels(G, pos, font_size=12) 
plt.show() 
plt.savefig('nx_graph1.png') 

edges_from_nx = G.edges() 

あなたがやったようigraph.Graphオブジェクトを初期化しよう:

g = ig.Graph(edges_from_nx) 

g.vcount() # returns 9. why? we supplied integers to igraph, 
      # what it considered as vertex indices 

'name' in g.vs.attributes() # returns False: vertices do not have names 

ig.plot(g, vertex_label = range(g.vcount())) 

graph without names

お知らせしますが、その後削除されているので、他のすべての頂点がに何が起こったのか、インデックス0、を備えた単一の頂点を予期しない方法で再索引付けされる。これを避けるために

TupleListコンストラクタでGraphオブジェクトを初期化:

g = ig.Graph.TupleList(edges_from_nx) 
g.vcount() # returns 8. this looks fine! 
'name' in g.vs.attributes() # returns True: good, labels are assigned 
          # to the `name` vertex attribute 
ig.plot(g, vertex_label = g.vs['name']) 

graph with correct labels

今、すべてがNetworkXと同じに見えます。注:これはcommunity_infomapとは関係ありません。 igraphで頂点や辺の安定した識別子が必要な場合は、それらを頂点または辺の属性で保持します。

関連する問題