我想使用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)
答案 0 :(得分:1)
根据原始提问者的评论进行更新:
我将块的大小存储在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