2016-03-19 10 views
2

Ich versuche, einen zweiteiligen Graphen auf einer Person-to-Person Graph mit NetworkX zu konvertieren:Bipartite in NetworkX nicht richtig funktionieren, wenn das Umbenennen von Knoten

import networkx as nx 
import ast 
from networkx.algorithms import bipartite 
x=(161,1),(589,2),(162,1),(163,1),(589,2) 
BI = nx.Graph() 
BI.add_edges_from(x) 
bottom_nodes, top_nodes = bipartite.sets(BI) 
GI = bipartite.projected_graph(BI, top_nodes) 
GI.edges() 

Das Ergebnis ist nicht korrekt:

>>> bottom_nodes 
{161, 162, 163, 2} 
>>> top_nodes 
{1, 589} 

Wenn ich x ändern sein:

x=(61,1),(58,2),(62,1),(63,1),(59,2) 

Die I korrektes Ergebnis:

Also irgendwie wenn ich "niedrigere" Nummern für Knoten verwende, dann ist die Konvertierung korrekt, sonst nicht. Aber ich brauche größere Zahlen, da ich mehr als 100 Knoten habe.

+0

Verwandte: http://math.stackexchange.com/questions/1102592/choosing-which-sets-of-nodes-are-top-and-bottom-in- bipartite-graph-represent –

+0

Als Randnotiz können Sie 'BI = nx.Graph (x)' direkt schreiben. –

Antwort

1

Die Knoten-Sets in einem zweiteiligen Graphen sind gleichwertig (korrigieren Sie mich, wenn ich einen falschen Begriff verwende) - es gibt keinen prinzipiellen Unterschied zwischen "top" und "bottom".

Gemäß den Referenzen in Choosing which sets of nodes are 'top' and 'bottom' in bipartite graph representations of real-world complex networks. - Mathematics Stack Exchange ist die Klassifizierung als solche eine Frage der Konvention (für die Einheitlichkeit), die in bestimmten Anwendungen vereinbart wurde, und nicht auf mathematischen Unterschieden. Also sind beide Antworten richtig.

Blick auf den Quellcode von networkx.algorithms.bipartite.sets zeigt, dass es an networkx.algorithms.bipartite.color delegiert, die wiederum über die Knoten iteriert. Der Knoten, der zuerst in for n in G kommt immer Farbe 1 zugeordnet und wird in den ersten Satz in sets:

In [2]: x=(161,1),(589,2),(162,1),(163,1),(589,2) 
In [4]: g=networkx.Graph(x) 
In [8]: g2=networkx.Graph(((80,2),(589,2),(162,1),(163,1),(589,2))) 

In [11]: [n for n in g] 
Out[11]: [161, 2, 163, 1, 162, 589] 

In [12]: [n for n in g2] 
Out[12]: [1, 2, 163, 162, 589, 80] 

In [14]: networkx.algorithms.bipartite.sets(g) 
Out[14]: ({2, 161, 162, 163}, {1, 589}) 

In [13]: networkx.algorithms.bipartite.sets(g2) 
Out[13]: ({1, 2}, {80, 162, 163, 589}) 

Also, wenn Sie eine bestimmte Idee haben, die unabhängige Eigenschaften eines Knotens als „top klassifizieren sollte "/" bottom ", müssen Sie tatsächlich programmieren in: eg schau dir das Ergebnis an und sieh, was wo hingekommen ist.

1

Da Sie bereits wissen, was Ihre bipartiten Mengen sind, können Sie sie explizit angeben.

import networkx as nx               
from networkx.algorithms import bipartite          
x=(161,1),(589,2),(162,1),(163,1),(589,2)          
BI = nx.Graph(x)                 
top = set(s for s,t in x)              
print(top)                  
GI = bipartite.projected_graph(BI, top)           
print(list(GI.edges())) 

OUTPUT

set([161, 162, 163, 589]) 
[(161, 162), (161, 163), (162, 163)]