【问题标题】:From matrix of community co-occurences to the index of community for every node从社区共现矩阵到每个节点的社区索引
【发布时间】:2014-09-17 08:41:07
【问题描述】:

我有一个n x n 矩阵X_{ij},如果图中的节点i 和节点j 属于同一个集群,则i-j-th 条目为1,否则为0。该矩阵是用于在图中查找社区的优化算法的结果。

我想将该矩阵转换为包含n 条目的列表,其中对于每个i-th 条目,我可以关联一个整数,该整数表示i-th 节点所属的单独集群。

例如,在python中,我的矩阵如下(在这种情况下节点0和1属于社区A,而节点2和3属于社区B)

matrix([[ 0.,  1.,  0.,  0.],
    [ 1.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  1.],
    [ 0.,  0.,  1.,  0.]])

表示节点0属于同一个社区(节点从0到n-1) 如何从该矩阵中提取这样的列表:

[A,A,B,B]

列表的第 i 个元素代表节点所属社区的索引? (我使用 A 和 B 只是为了更清楚,但这些索引实际上是整数)

【问题讨论】:

  • 是否保证这种关系是对称的 (X_{ij} = X_{ji})和传递的 (X_{ij} = 1, X_{jk}= = 1 -> X_{ik} = 1)?
  • 矩阵是一个不连贯图的表示。您需要找到连接的组件。扫描矩阵并执行简单的 BFS 或 DFS。当你不能更进一步时,取任何剩余的未扫描节点
  • 是的,因为我得到的解决方案强制传递性和对称性。

标签: python algorithm graph cluster-analysis


【解决方案1】:

假设你有这个关系是symmetric (X_{ij} = X_{ji}) 和transitive (X_{ij} = 1, X_{jk}= = 1 -> X_{ik} = 1),你可以把你的矩阵看作一个图G=(V,E),其中每个索引i=1,...,n 是一个节点,而@ 987654329@ 在E 中当且仅当X_{ij} = 1

因此,您的“社区”实际上是图表的连接组件
使用任何图发现/遍历算法(例如BFSDFS)使用以下高级伪代码查找连接组件相当容易:

X = V //all nodes initially in X
count = 1
while X is not empty:
   choose random x in X 
   do BFS from x, let the set of discovered nodes be U
   for each node u in U:
        yield (u,count) //u is in the community labeled as count
   count = count + 1
   X = X \ U //remove all nodes in U from X

【讨论】:

  • 谢谢,我已经使用 networkx 从共现矩阵中获取连接组件,然后在这些连接组件中的节点上进行迭代。这解决了我的一天!
猜你喜欢
  • 2019-04-21
  • 2019-02-14
  • 2014-10-04
  • 2017-07-21
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2015-05-05
  • 2021-09-03
相关资源
最近更新 更多