NetworkX 中的二分体在重命名节点时无法正常工作
Bipartite in NetworkX not working properly when renaming nodes
我正在尝试使用 networkX 将二分图转换为人对人图:
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()
结果不正确:
>>> bottom_nodes
{161, 162, 163, 2}
>>> top_nodes
{1, 589}
如果我将 x 更改为:
x=(61,1),(58,2),(62,1),(63,1),(59,2)
我得到正确的结果:
>>> bottom_nodes
{1, 2}
>>> top_nodes
{58, 59, 61, 62, 63}
所以如果我对节点使用 "lower" 数字,那么转换是正确的,否则不是。但是,我需要更大的数字,因为我有超过 100 个节点。
二分图中的节点集是等效的(如果我使用了错误的术语请纠正我)- 命名 "top" 和命名 "bottom".[=17 没有主要区别=]
根据 Choosing which sets of nodes are 'top' and 'bottom' in bipartite graph representations of real-world complex networks. - Mathematics Stack Exchange 中的参考资料,将它们分类是在特定应用程序中商定的惯例(为了统一),而不是任何数学差异。所以,这两个答案实际上都是正确的。
查看 networkx.algorithms.bipartite.sets
的源代码表明它委托给 networkx.algorithms.bipartite.color
,后者依次遍历节点。 for n in G
中最先出现的节点始终分配颜色 1
并进入 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})
因此,如果您有一些具体想法,节点的哪些 无关 属性应将其分类为 "top"/"bottom",您需要 实际编程为: 例如查看结果,看看得到了什么。
因为您已经知道您的二部集是什么,您可以明确指定它们。
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()))
输出
set([161, 162, 163, 589])
[(161, 162), (161, 163), (162, 163)]
我正在尝试使用 networkX 将二分图转换为人对人图:
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()
结果不正确:
>>> bottom_nodes
{161, 162, 163, 2}
>>> top_nodes
{1, 589}
如果我将 x 更改为:
x=(61,1),(58,2),(62,1),(63,1),(59,2)
我得到正确的结果:
>>> bottom_nodes
{1, 2}
>>> top_nodes
{58, 59, 61, 62, 63}
所以如果我对节点使用 "lower" 数字,那么转换是正确的,否则不是。但是,我需要更大的数字,因为我有超过 100 个节点。
二分图中的节点集是等效的(如果我使用了错误的术语请纠正我)- 命名 "top" 和命名 "bottom".[=17 没有主要区别=]
根据 Choosing which sets of nodes are 'top' and 'bottom' in bipartite graph representations of real-world complex networks. - Mathematics Stack Exchange 中的参考资料,将它们分类是在特定应用程序中商定的惯例(为了统一),而不是任何数学差异。所以,这两个答案实际上都是正确的。
查看 networkx.algorithms.bipartite.sets
的源代码表明它委托给 networkx.algorithms.bipartite.color
,后者依次遍历节点。 for n in G
中最先出现的节点始终分配颜色 1
并进入 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})
因此,如果您有一些具体想法,节点的哪些 无关 属性应将其分类为 "top"/"bottom",您需要 实际编程为: 例如查看结果,看看得到了什么。
因为您已经知道您的二部集是什么,您可以明确指定它们。
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()))
输出
set([161, 162, 163, 589])
[(161, 162), (161, 163), (162, 163)]