2016-12-21 7 views
0

Я использую функцию cluster_infomap из igraph в R для обнаружения сообществ в неориентированной, невзвешенной сети с ~ 19 000 ребер, но каждый раз, когда я запускаю эту функцию, я получаю разное количество сообществ. Это код, я использую:Почему cluster_infomap в igraph R каждый раз дает разные сообщества?

clusters <- list() 
    clusters[["im"]] <- cluster_infomap(graph) 
    membership_local_method <- membership(clusters[["im"]]) 
    length(unique(membership_local_method)) 

Результат последней строки кода в диапазоне от 805-837 в тестах я выполнил. Я попытался использовать set.seed() в случае, если это была проблема генерации случайных чисел, но это не решает проблему.

Мои вопросы: (1) почему я получаю разные сообщества каждый раз, и (2) есть ли способ сделать его стабильным?

Спасибо!

+0

Там нет никакого способа узнать из информации, предоставленной - может вы делаете воспроизводимый пример, который дает разные результаты при каждом прогоне? – thelatemail

+0

Пожалуйста, наведите курсор на тег R - он запрашивает минимальный воспроизводимый пример. [Вот руководство] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#answer-5963610); также просмотрите файлы справки R (например, '? cluster_infomap', _examples_ section) и ответы обычных плакатов (щелкните тег R). После этого отредактируйте и улучшите свой вопрос соответственно. Хороший, как правило, обеспечивает минимальные входные данные, желаемые выходные данные, попытки кода, включая необходимые пакеты, - все операции копирования-вставки в новом/чистом сеансе R. * Почему? * Это облегчает для всех возможность следовать и участвовать. – lukeA

ответ

2

cluster_infomap (см ?igraph::cluster_infomap для справки) находит структуру

сообщества, что сводит к минимуму ожидаемую длину Описание случайный ходок траектории

Всякий раз, когда вы имеете дело с генерацией случайных чисел, то вы получите разные результаты при каждом прогоне. Большую часть времени, вы можете переопределить это, установив семена с помощью set.seed (см ?Random для справки) заранее:

identical(cluster_infomap(g), cluster_infomap(g)) 
# [1] FALSE 
identical({set.seed(1);cluster_infomap(g)},{set.seed(1);cluster_infomap(g)}) 
# [1] TRUE 

или графически:

library(igraph) 
set.seed(2) 
g <- ba.game(150) 
coords <- layout.auto(g) 
par(mfrow=c(2,2)) 

# without seed: different results 
for (x in 1:2) { 
    plot(
    cluster_infomap(g), 
    as.undirected(g), 
    layout=coords, 
    vertex.label = NA, 
    vertex.size = 5 
) 
} 

# with seed: equal results 
for (x in 1:2) { 
    set.seed(1) 
    plot(
    cluster_infomap(g), 
    as.undirected(g), 
    layout=coords, 
    vertex.label = NA, 
    vertex.size = 5 
) 
} 
+0

Спасибо за подробный ответ! Я вижу, что мне нужно установить set.seed прямо перед вызовом функции cluster_infomap. Это решает проблему. Благодаря! – asmac

Смежные вопросы