我使用来自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)有没有办法让它稳定下来?
谢谢!
答案 0 :(得分:3)
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
)
}