Как извлечь вектор членства для моего GNgraph в R? - PullRequest
0 голосов
/ 21 июня 2019

Я хочу использовать 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 Ответ

1 голос
/ 21 июня 2019

ОБНОВЛЕНИЕ после первоначальных комментариев автора вопроса:

Я храню размеры блоков в векторе 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
...