Как извлечь вектор членства для моего GNgraph в R?
Я хочу использовать 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)
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