搜索单个二分网络

时间:2010-01-09 09:46:33

标签: python search graph social-networking igraph

我有以下形式的数据,它构成了一个二分网络。

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。

我读了很多关于网络流量和图表的文章,关于我的问题究竟在哪里,我感到有点困惑。这只是广度优先搜索的一种形式还是有更有效的方法来做到这一点?

由于

5 个答案:

答案 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')]