跨多个迭代比较 igraph 集群成员

Compare igraph cluster membership across multiple iterations

这个问题建立在这个 one 的例子之上。
上述示例共享此代码,用于在给定聚类算法多次迭代后存储社区列表。例如,对于 100 次迭代:

communities <- list()
for (i in 1:100){
  set.seed(3+i)
  communities [[i]] <- cluster_spinglass(graph_obj)
}

使用 igraph,如果我 运行 对具有某种随机性的聚类方法(例如 spinglass)进行多次迭代,我每次都会获得略有不同的结果。因此,在每个 运行,我最终可能会得到不同数量的集群,以及每个集群中的一组不同节点。有没有办法跟踪某些节点在多次迭代中最终出现在同一个集群中的频率?基本原理是找出是否,例如,在 100 次迭代中,某个节点 A 与节点 B 在同一集群中放置 90 次,在其他地方放置 10 次。

每一对节点都会有一个数字,所以看起来 在 vcount x vcount 矩阵中跟踪这一点很自然。

首先,一些示例数据。

library(igraph)

set.seed(1234)
g = erdos.renyi.game(13, 0.2)

将矩阵初始化为全零,然后将 (i,j) 加一 每次节点 i 和 j 在同一个社区中的元素。

COMM = matrix(0, nrow=vcount(g), ncol=vcount(g)) 
for(i in 1:100){
    set.seed(3+i)
    CS = cluster_spinglass(g)
    for(m in 1:max(CS$membership)) {
        Group = which(CS$membership==m)
        COMM[Group, Group] = COMM[Group, Group] +1
    }
}
COMM
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
 [1,]  100    0    0   98    0    0    0    0    0     0   100     0   100
 [2,]    0  100    0    0   99    0   91   99    0     0     0    99     0
 [3,]    0    0  100    0    0  100    0    0  100   100     0     0     0
 [4,]   98    0    0  100    0    0    0    0    0     0    98     0    98
 [5,]    0   99    0    0  100    0   92  100    0     0     0   100     0
 [6,]    0    0  100    0    0  100    0    0  100   100     0     0     0
 [7,]    0   91    0    0   92    0  100   92    0     0     0    92     0
 [8,]    0   99    0    0  100    0   92  100    0     0     0   100     0
 [9,]    0    0  100    0    0  100    0    0  100   100     0     0     0
[10,]    0    0  100    0    0  100    0    0  100   100     0     0     0
[11,]  100    0    0   98    0    0    0    0    0     0   100     0   100
[12,]    0   99    0    0  100    0   92  100    0     0     0   100     0
[13,]  100    0    0   98    0    0    0    0    0     0   100     0   100

现在您可以看到节点 1 和 4 在同一社区中的次数为 100 次中的 98 次, 但是节点 2 和 7 在同一个社区中只有 100 次中有 91 次。 (通常有3个社区,但有时有4个。例如,当i=60时, 我们有 4 个社区。)