1

我正在使用 R 中 igraph 中的 cluster_infomap 函数来检测具有约 19,000 条边的无向、未加权网络中的社区,但每次运行该函数时,我都会得到不同数量的社区。这是我正在使用的代码:

   clusters <- list()
   clusters[["im"]] <- cluster_infomap(graph)
   membership_local_method <- membership(clusters[["im"]])
   length(unique(membership_local_method))

在我执行的测试中,最后一行代码的结果范围为 805-837。我尝试使用 set.seed() 以防它是随机数生成的问题,但这并不能解决问题。

我的问题是(1)为什么我每次都会得到不同的社区,以及(2)有没有办法让它稳定?

谢谢!

4

1 回答 1

4

cluster_infomap(请参阅?igraph::cluster_infomap帮助)找到一个

最小化随机游走轨迹的预期描述长度的社区结构

每当您处理随机数生成时,每次运行都会得到不同的结果。set.seed大多数情况下,您可以通过预先使用(请参阅?Random帮助)设置种子来覆盖它:

identical(cluster_infomap(g), cluster_infomap(g))
# [1] FALSE
identical({set.seed(1);cluster_infomap(g)},{set.seed(1);cluster_infomap(g)})
# [1] TRUE

或以图形方式:

library(igraph)
set.seed(2)
g <- ba.game(150)
coords <- layout.auto(g)
par(mfrow=c(2,2))

# without seed: different results
for (x in 1:2) {
  plot(
    cluster_infomap(g), 
    as.undirected(g), 
    layout=coords, 
    vertex.label = NA, 
    vertex.size = 5
  )
}

# with seed: equal results
for (x in 1:2) {
  set.seed(1)
  plot(
    cluster_infomap(g), 
    as.undirected(g), 
    layout=coords, 
    vertex.label = NA, 
    vertex.size = 5
  )
}
于 2016-12-21T09:35:52.957 回答