Подход и пример кластеризации графов в «R»


10

Я ищу, чтобы сгруппировать / объединить узлы в графе, используя кластеризацию графа в 'r'.

Вот потрясающе игрушечный вариант моей проблемы.

  • Есть два "кластера"
  • Существует «мост», соединяющий кластеры

Вот сеть-кандидат:
введите описание изображения здесь

Когда я смотрю на расстояние соединения, "hopcount", если хотите, то я могу получить следующую матрицу:

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

Мысли здесь:

  • К счастью или из-за простоты игрушки, матрица имеет очевидные пятна, это не будет иметь место в (очень большой) матрице. Если бы я рандомизировал отношения между точкой и строкой, то это было бы не так чисто.
  • Я мог ошибиться - так что, если у меня будет опечатка, дайте мне знать.
  • Число прыжков здесь - это самое короткое число прыжков для соединения точки в строке i с точкой в ​​столбце j. Самостоятельный прыжок - все еще прыжок, таким образом, диагональ - все.

Таким образом, в этой матрице большее расстояние (прыжки) имеет большее число. Если бы я хотел матрицу, показывающую «связность» вместо расстояния, то я мог бы сделать обратную точку, где каждая ячейка матрицы заменяется на ее мультипликативный обратный.

Вопросов:

Чтобы помочь мне найти свой путь:

  • Каковы условия сокращения числа узлов на графе путем их объединения? Это кластеризация, слияние, слияние - какие слова мне следует использовать?
  • Каковы проверенные методы? Есть ли учебник по теме? Можете ли вы указать на документы или веб-сайты?
  • Теперь я попытался посмотреть здесь первым - это отличное место для «первой проверки». Я не нашел то, что искал. Если я пропустил это (не маловероятно), можете ли вы указать мне на ответ на один или два вопроса по теме здесь, в резюме?

Чтобы получить меня, куда я иду:

  • Существует ли пакет 'R', который будет правильно кластеризовать узлы в сети?
  • Не могли бы вы указать мне пример кода, чтобы сделать это?
  • Есть ли пакет 'R', который графически представит полученную уменьшенную сеть?
  • Не могли бы вы указать мне пример кода, чтобы сделать это?

Заранее спасибо.


2
Обратите внимание, что запрос пакетов (R) или кода здесь не по теме. Вы можете сделать часть «найти» более заметной, а часть «получить» - менее заметной.
gung - Восстановить Монику

3
Я постараюсь дать полный ответ, когда получу шанс @gung. Но для быстрого ответа здесь - обнаружение сообщества, примененное к графу примера EngrStudent с использованием igraphпакета R.
Энди Ш

1
ИМХО в этом графе только один кластер. Есть, однако, три пересекающихся клики . Я не знаю, почему ваш план состоит в том, чтобы уничтожить среднюю клику - если вы не сможете формализовать это, вам будет сложно найти алгоритм.
ВЫЙТИ - Anony-Mousse

2
Для чего стоит mcl ( micans.org/mcl ) находит два кластера (я не совсем согласен с оценкой Анони-Мусса, и я не нахожу подход моделирования кликов к кластеризации графов особенно плодотворным). Это с единственным параметром (контролирующим гранулярность), установленным по умолчанию. Этот алгоритм (mcl - я его опубликовал) довольно широко используется в биоинформатике, и (очень масштабируемый) исходный код доступен. Взаимодействие с R легко сделать с помощью текстовых интерфейсов.
micans

2
Запрашивать код и пакеты здесь всегда было не по теме. Обращение за помощью к существующему коду (т. Е. У вас есть воспроизводимый пример ) обсуждается в статье Переполнение стека . Если вы этого не знали, пришло время изучить это. Идея о том, что пользователи, отвечающие на R Q в SO, не имеют статистической экспертизы, странна для меня, но многие люди, кажется, предполагают это; во всяком случае, это не так. То, что на ваш вопрос ответил SO сообщение, должно кое-что сказать здесь. OTOH, говоря «что это за анализ, может кто-то указать мне на ресурсы», определенно здесь уместно.
gung - Восстановить Монику

Ответы:


9

Ваш конкретный пример предлагает найти сообщества в сети, которые имеют больше соединений между узлами в сообществе и относительно немного ребер между узлами в разных сообществах. Это отличается от поиска изолированных сообществ , в которых есть полностью отключенные подграфы.

Вот пример обнаружения сообщества в R с использованием igraphпакета и алгоритма, описанного в Clauset et al. (2004) . Чтобы использовать этот алгоритм, я превращаю ваш «счетчик прыжков» в двоичную матрицу смежности без собственных циклов. Алгоритму нужна неориентированная матрица, которая соответствует вашей рукописной диаграмме и предоставленным вами данным (ребра симметричны).

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

введите описание изображения здесь

Я не могу комментировать целесообразность свертывания таких узлов для дальнейшего анализа, но такое обнаружение сообщества определенно полезно для исследования сети. Существует также множество других алгоритмов обнаружения сообщества (а также других библиотек для анализа сети в R). Это только один пример, который дает желаемый результат для этой игрушечной задачи.


1
Также, учитывая предыдущие комментарии об использовании базы данных графов, вам не нужно представлять граф в виде матрицы смежности. Таблица для узлов и строки для каждого ребра - более типичный / эффективный формат, и вы можете превратить его в igraphсеть.
Энди Вт

1

Если вы еще не подключены к репозиторию для своего узла и данных соединения, вы можете посмотреть на пакет Rneo4j. Но это подразумевает использование neo4j (графической базы данных, а не RDBMS) для хранения ваших данных. Я не эксперт здесь, но я думаю, что этот подход может быть особенно эффективным, если а) как предложено Anony-Mousse, вы не можете формализовать это, или б) количество узлов и соединений особенно велико, или в) вы наматываете возникли дополнительные вопросы относительно вашей сети.


Я не знал, что такая вещь существует. Ухоженная! Это достойный пример материала? nicolewhite.github.io/RNeo4j/examples
EngrStudent

Как перейти от данных в neo4j к кластеризации графов? Будет ли работать с ним mcl или igraph?
EngrStudent

2
После того, как вы извлекли свои данные из neo4j в R, вы можете использовать любой другой R-пакет (например, AndyW предлагает igraph) против данных. Альтернативно - пакет Rneo4j включает в себя команды для извлечения данных, а также позволяет запускать язык запросов Cypher (аналог SQL, но специально созданный для графа neo4j db). В Cypher вы можете выполнять сложные запросы и запускать некоторые предопределенные алгоритмы (кратчайшие пути, все пути, все простые пути, Dijkstra и т. Д.). Я нахожусь на своем пределе и в символах, и в содержании. Если вы хотите пойти по этому пути (извините!), Сайт neo4j может стать вашей следующей остановкой.
user3123116

1

Для будущих читателей,

Вот набор функций из пакетов igraph, и последний из MCL:

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

Вы можете найти документацию здесь http://igraph.org/r/doc/ и здесь https://cran.r-project.org/web/packages/MCL/MCL.pdf

Я считаю Walktrap особенно полезным


Хотя это может быть связано с вопросом, это не похоже на ответ.
Майкл Р. Черник

2
я ответил на два вопроса: существует ли пакет 'R', который будет правильно кластеризовать узлы в сети? Не могли бы вы указать мне пример кода, чтобы сделать это? Но да, это не отвечает на весь набор вопросов.
Омар Джаафор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.