Как извлечь вектор членства для моего 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
Другие вопросы по тегам