1

我想使用 NMI 将我在社区检测中的算法与其他方法进行比较。所以我正在制作一些图表sample_sbm(),我用这些图表定义给我 10 个节点,并且在block.sizes=c(3,3,4)部分我定义有社区,第一个有 3 个成员,第二个有 3 个,第三个4名成员。现在我想要他们的成员向量。它应该是:1 1 1 2 2 2 3 3 3 3

最好的方法是什么?我正在考虑采用 3 个参数 c1、c2、c3,然后在 block.sizes() 中使用它们,所以我可以使用 for 循环来构建成员向量。但看起来有点脏.因为社区的数量应该是任意的。如果你给我一些更好的建议,我将不胜感激

library(igraph)
p<-cbind( c(1, 0,0), c(0, 1,0) ,c(0,0,1))
g <- sample_sbm(10, pref.matrix=p, block.sizes=c(3,3,4) )


#comunity detection algorithm
wc <- cluster_walktrap(g)
modularity(wc)

a=membership(wc)

4

1 回答 1

2

根据原始提问者的评论进行更新:

我将块的大小存储在my_block_sizes向量中。然后我使用rep.int函数和seq_along函数根据块的大小创建成员向量。

library(NMI)
library(igraph)

my_block_sizes <- c(3,3,4)

# make a membership vector
membership_vector <- rep.int(seq_along(my_block_sizes), my_block_sizes)
membership_vector
[1] 1 1 1 2 2 2 3 3 3 3

p <- cbind(c(1,0,0), c(0,1,0), c(0,0,1))
g <- igraph::sample_sbm(10, pref.matrix=p, block.sizes=my_block_sizes)

# comunity detection algorithm
wc <- cluster_walktrap(g)
modularity(wc)

a <- membership(wc)

原答案:

我不是 100% 确定这是您所追求的,但根据您提供的信息,这可能会解决您的问题。

我使用wc对象的长度来确定社区检测算法检测到的社区数量,以及rep.int根据块的大小重复每个社区号的函数,我预先存储在my_block_sizes对象中。

library(NMI)
library(igraph)

my_block_sizes <- c(3,3,4)

p <- cbind(c(1,0,0), c(0,1,0), c(0,0,1))
g <- igraph::sample_sbm(10, pref.matrix=p, block.sizes=my_block_sizes)


#comunity detection algorithm
wc <- cluster_walktrap(g)
modularity(wc)

a <- membership(wc)

# make a membership vector
membership_vector <- rep.int(1:length(wc), my_block_sizes)
membership_vector
[1] 1 1 1 2 2 2 3 3 3 3
于 2019-06-21T16:19:07.447 回答