2017-04-02 6 views
0

222 x 222 노드 크기의 가중치가있는 인접성 매트릭스에서 그래프를 생성합니다. 행렬에 주어진 모든 가중치는 0.427574985460890291.6671726002927263 사이의 부동 소수점 숫자입니다. nx.minimum_spanning_tree(G, weight = "weight") 방법을 사용하면 아래 그림의 첫 번째 그림이 표시되는 반면, 모든 매트릭스 값에 100.0을 곱하면 동일한 방법으로 두 번째 그림을 얻을 수 있습니다. igraph을 사용하여 플로팅하는 동안 발생하지 않습니다. Networkx의 문서는 정밀도 문제에 대해 침묵합니다. 왜 그런 일이 일어날 지 알고 있습니까? Minimum spanning tree of a graph with potential precision issues Minimum spanning tree of a graphNetworkx 최소 스패닝 트리 - 정밀도 문제?

networkx 코드 :

G=nx.from_numpy_matrix(M) 
G1=nx.minimum_spanning_tree(G, weight = "weight") 

labels = {i : node_names[i][1] for i in G1.nodes()} 
colors = {i : node_attributes[labels[i]] for i in G1.nodes()} 
for i in G1.nodes(): 
    G1.node[i]["color"] = 'white' 
    G1.node[i]["style"] = "filled"  
    G1.node[i]["fillcolor"] = colors[i] 
color=nx.get_node_attributes(G1,'color') 
fillcolor=nx.get_node_attributes(G1,'fillcolor') 
H=nx.relabel_nodes(G1,labels) 
nx.draw(H, scale=30, nodelist=H.nodes(), linewidths=0, with_labels = True, node_size=500,font_size=8) 

igraph 코드 :

g = igraph.Graph.Weighted_Adjacency(M.tolist()) 
    for i, v in enumerate(g.vs): 
     v["color"] = colors[i] 
     v["label"] = labels[i] 
     v["frame_color"] = colors[i] 
     v["label_size"] = 10 
     v["size"] = 26 
    G = g.spanning_tree(weights='weight', return_tree=True) 
    G.to_undirected() 
    igraph.plot(G, labels=False, bbox = (900, 900), margin=40, loops=False 

) 
+0

이러한 알고리즘은 파이썬 부동 소수점 숫자를 사용하고 이러한 연산의 정밀도를 상속합니다 (부동 소수점은 https://docs.python.org/3/tutorial/floatingpoint.html에 따라 53 비트입니다) – Aric

+0

아마도 예제를 게시 할 수 있습니다 문제가 무엇인지 알 수 있습니까? – Aric

+1

나무가 다른가요? 나는 레이아웃 만 다르다고 믿지만 토폴로지는 적어도 언뜻보기에는 동일합니다. – DyZ

답변

-1

당신이 볼 것이 예상되는 행동과 전혀 정밀 문제. 이름에서 알 수 있듯이 스프링 레이아웃은 노드 사이의 스프링 동작을 해당 위치에 "시뮬레이트"합니다. 노드 위치는 원으로 초기화 된 다음 특정 반복 횟수 (기본적으로 50) 동안 스프링의 힘이 노드에 적용됩니다. 약한 연결 가중치를 사용하면 노드가 원 (첫 번째 경우)에 거의 남아 있고 노드가 중심쪽으로 두 번째로 강한 영향을 미칩니다 (두 번째 경우).

igraph에서는 기본적으로 가중치가 적용되지 않은 그래프가 레이아웃을 계산하는 데 사용되며 플로팅 루틴에 명시 적으로 가중치를 부여해야합니다. "weights"매개 변수를 지정하지 않고 그래프를 플로팅했을 수도 있습니다.

+0

왜 나는 igraph에 대한 가중치가없는 그래프를 그렸다고 생각 하는가? 대답은 networkx에 해당하며 networkx는 spring을 기본 레이아웃으로 사용함을 알 수 있습니다. 그러나 igraph는 기본적으로 스프링을 사용하지 않습니다. – Leukonoe

+1

가중치 매개 변수 설정에 대한 설명은 다음과 같습니다. 기본 레이아웃 : igraph는 기본적으로 Kamada-Kawei를 작은 그래프로 사용하고 Fruchterman-Reingold (일명 봄 레이아웃)는 큰 그래프를 사용합니다. IIRC, 컷오프는 약 1000 노드입니다. – Paul

+0

좋아요, 그래서 igraph는 스프링 레이아웃을 사용하고, 'G = g.spanning_tree (weights ='weight ', return_tree = True)'와 같이 가중치가 지정되어 있으므로 igraph MST에 가중치를주었습니다. 그렇다면 왜'G.is_weighted()'가'False'를 리턴합니까? 가중치가 실제로 고려되지 않았을 가능성이 있습니까? – Leukonoe