我有以下形式的数据,它构成了一个二分网络。
A1 - B1
A2 - B2
A2 - B1
A3 - B1
A4 - B2
A5 - B3
A6 - B3
A7 - B3
A7 - B3
A8 - B4
A9 - B3
我想做的是写一些东西(理想情况下是在python或C中)或使用现有的库来识别数据中的各个社区。例如
A1,A2,A3,A4都属于同一社区,因为它们连接到B1,B2类似A5,A6,A7,A8,A9都连接到B3和B4。
我读了很多关于网络流量和图表的文章,关于我的问题究竟在哪里,我感到有点困惑。这只是广度优先搜索的一种形式还是有更有效的方法来做到这一点?
由于
答案 0 :(得分:3)
使用Python和igraph library,您可以执行以下操作:
import igraph
graph = igraph.Graph.Formula("A1-B1, A2-B2, A2-B1, A3-B1, A4-B2, A5-B3, A6-B3, A7-B3, A8-B4, A9-B3")
comms = graph.clusters()
for comm in comms:
print ", ".join(graph.vs[comm]["name"])
一个简短的解释:Graph.Formula
从上面的字符串表示中构造一个图形,但是您可以使用igraph提供的任何其他方法来构建图形。使用Graph.Formula
的一个优点是它会自动创建一个包含顶点名称的name
顶点属性。 graph.clusters()
搜索网络的已连接组件并返回VertexClustering
对象。可以在for
循环中使用此对象来迭代组件。在for
循环的核心中,comm
变量将始终包含当前社区中节点的索引。我使用graph.vs[comm]
选择社区的顶点,将其名称作为列表(graph.vs[comm]["name"]
)请求,然后用逗号连接名称。
答案 1 :(得分:1)
如果您想使用Python,请阅读NetworkX库。它有许多用于图形的模块和算法实现。特别是,您可能会发现Bipartite模块很有用。我不确定“社区”是什么意思,但该模块中的bipartite_color
功能可能会对您有所帮助。
答案 2 :(得分:1)
可能是这样的:
import collections
data = ( ("A1", "B1"), ("A2", "B2"), ("A2", "B1") )
out = collections.defaultdict(list)
for value, key in data:
out[key].append(value)
print out
-> defaultdict(<type 'list'>, {'B1': ['A1', 'A2'], 'B2': ['A2']})
这只能单向工作。你当然可以做2个dicts,一个用A组作为键,一个用B组作为键。它假定键是不可变的(字符串,数字)。
答案 3 :(得分:1)
没有!请注意使用NetworkX库,因为二分图的功能不超过4个。 一个用于验证它是否为二分,一个用于着色节点,一个用于创建没有权重的简单二分网络,另一个用于创建二分网络的投影 你可以使用最后一个函数。
答案 4 :(得分:1)
@Eli最好找到连接的组件。既然您知道标签(在这种情况下无论如何)以“A”开头,您可以这样做:
import networkx as nx
edges = """A1 - B1
A2 - B2
A2 - B1
A3 - B1
A4 - B2
A5 - B3
A6 - B3
A7 - B3
A7 - B3
A8 - B4
A9 - B3""".split('\n')
G = nx.parse_edgelist(edges,delimiter=' - ')
for component in nx.connected_components(G):
print [n for n in component if n.startswith('A')]