Почему cluster_infomap в igraph R каждый раз дает разные сообщества?

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

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

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

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

Спасибо!


person asmac    schedule 21.12.2016    source источник
comment
По предоставленной информации невозможно сказать - можете ли вы сделать воспроизводимый пример, который дает разные результаты при каждом запуске?   -  person thelatemail    schedule 21.12.2016
comment
Пожалуйста, наведите указатель мыши на тег R — он запрашивает минимальный воспроизводимый пример. Вот руководство; также просмотрите файлы справки R (например, ?cluster_infomap, раздел примеры) и ответы обычных авторов (щелкните тег R). После этого отредактируйте и улучшите свой вопрос соответственно. Хороший обычно предоставляет минимальные входные данные, желаемые выходные данные, попытки кода, включая необходимые пакеты - все это можно скопировать-вставить-запустить в новом/чистом сеансе R. Почему? Так всем легче следить и участвовать.   -  person lukeA    schedule 21.12.2016


Ответы (1)


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
  )
}
person lukeA    schedule 21.12.2016
comment
Спасибо за ваш подробный ответ! Я вижу, что мне нужно установить set.seed прямо перед вызовом функции cluster_infomap. Это решает проблему. Спасибо! - person asmac; 22.12.2016