【问题标题】:Searching for individual bipartite networks搜索单个二分网络
【发布时间】:2011-01-03 05:27:33
【问题描述】:

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

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。

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

谢谢

【问题讨论】:

    标签: python search graph social-networking igraph


    【解决方案1】:

    使用 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"]),然后用逗号连接名称。

    【讨论】:

      【解决方案2】:

      @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')]
      

      【讨论】:

        【解决方案3】:

        如果您想使用 Python,请阅读 NetworkX 库。它有很多用于图的模块和算法实现。特别是,您可能会发现 Bipartite 模块很有用。我不确定您所说的“社区”是什么意思,但该模块中的 bipartite_color 函数可能会对您有所帮助。

        【讨论】:

        • 社区我的意思是,在我的数据中,我将有几个未连接的二部图,我想要一种方法来建立与数据中每个未连接的二部图相关的所有 A 和 B。
        • @David:然后尝试首先对您的数据运行“连接组件”算法(该算法也存在于 NetworkX 中)以查找连接子图。然后,您可以确定每个组件/子图的二分分割。
        【解决方案4】:

        可能是这样的:

        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 个字典,一个将 A 设置为键,一个将 B 设置为键。它假定键是不可变的(字符串、数字)。

        【讨论】:

        • 我想如果我要走这条路,我将不得不像你说的那样使用两个字典,因为 B1 与 B2 相关,因为 A2 在两者中都是一个值。
        【解决方案5】:

        不!注意使用 NetworkX 库,因为它没有超过 4 个用于二分图的函数。 一个用于验证它是否是二分的,一个用于为节点着色,一个用于创建没有权重的简单二分网络,另一个用于创建二分网络的投影 您可以使用最后一个功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-20
          • 1970-01-01
          相关资源
          最近更新 更多