извлекать членство в сообществе после обнаружения сообщества в igraph (R) - PullRequest
0 голосов
/ 20 сентября 2019

У меня возникли проблемы с извлечением членства в сообществе после запуска алгоритмов обнаружения сообщества в igraph.Сохраненный вектор membership не соответствует членству в сообществе, найденному алгоритмом.Я подозреваю, что мне чего-то не хватает, но документация тонкая, любая помощь приветствуется.

Мой пример:

Создание взвешенного графика с тремя сообществами и двумя компонентами:

v1 <- c(1,1,2,3,4,4,6,7,8,9)
v2 <- c(2,3,3,4,5,6,5,8,9,7)
weight <- c(3,3,2,1,3,3,2,2,2,3)

graph <- data.frame(v1,v2)
g <- graph.data.frame(graph, directed=FALSE)

Сообщества на приведенном выше графике - вершины (1,2,3), (4,5,6) и (7,8,9).И действительно, когда мы запускаем алгоритм обнаружения сообщества, это то, что он находит:

cd <- fastgreedy.community(g)
plot(cd,g, edge.width=weight)
str(cd)

Дает вывод:

IGRAPH clustering fast greedy, groups: 3, mod: 0.56
 groups:
  1
  [1] "7" "8" "9"

  2
  [1] "4" "6" "5"

  3
  [1] "1" "2" "3"`

и эта прекрасная картина графика разбивается насообщества.

Однако, когда я пытаюсь получить доступ к cd$membership или cutat(), это другая картина:

cd$membership
cutat(cd, steps=which.max(cd$modularity)-1)

оба дают

[1] 3 3 3 2 2 1 1 1 2

Я не прав, интерпретируя вышеизложенное как указание на членство в сообществе каждой вершины?Кажется, что это (правильно) присваивать (1,2,3) сообществу 3, но неправильно группировать (4,5,9) и (6,7,8) вместе.

1 Ответ

0 голосов
/ 20 сентября 2019

Кажущееся несоответствие происходит из порядка igraph, считывающего и назначающего идентификаторы вершин (см. этот ответ для справки).

Давайте посмотрим на порядок вершин, предоставленный graph -объектом:

> unlist(graph, use.names = F)               # identical to c(v1, v2)
 [1] 1 1 2 3 4 4 6 7 8 9 2 3 3 4 5 6 5 8 9 7

В этой последовательности 5 появляется только после 1,2,3,4,6,7,8,9.Это результирующая последовательность вершин после удаления повторяющихся записей:

> unique(unlist(graph, use.names = F))
[1] 1 2 3 4 6 7 8 9 5

или использование igraph:

> V(g)
+ 9/9 vertices, named, from 3bae324:
[1] 1 2 3 4 6 7 8 9 5

, что хорошо согласуется с сообществами, найденными в вашем примере:

> sort(membership(cd))
7 8 9 4 6 5 1 2 3         # vertex name
1 1 1 2 2 2 3 3 3         # community

Поскольку последовательности совпадают, вы можете назначить членство в качестве атрибута вершины следующим образом (как предложено @ chinsoon12):

V(g)$community <- membership(cd)
...