Каковы различия между алгоритмами обнаружения сообщества в igraph?

У меня есть список около 100 объектов igraph с типичным объектом, имеющим около 700 вершин и 3500 ребер.

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

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

Ответ 1

Вот краткий обзор об алгоритмах обнаружения сообщества, которые в настоящее время реализованы в igraph:

  • edge.betweenness.community - это процесс иерархического декомпозиции, в котором ребра удаляются в порядке убывания их значений межречия между границами (т.е. количество кратчайших путей, проходящих через заданное ребро). Это связано с тем, что ребра, соединяющие разные группы, с большей вероятностью будут содержаться в нескольких кратчайших путях просто потому, что во многих случаях они являются единственным вариантом перехода от одной группы к другой. Этот метод дает хорошие результаты, но очень медленный из-за сложной вычислительной сложности расчетов между границами и потому, что оценки интервалов должны быть пересчитаны после каждого удаления края. Ваши графики с ~ 700 вершинами и ~ 3500 ребер находятся вокруг верхнего предела размеров графиков, которые можно проанализировать с помощью этого подхода. Другим недостатком является то, что edge.betweenness.community создает полную дендрограмму и не дает вам никаких указаний о том, где можно сократить дендрограмму, чтобы получить конечные группы, поэтому вам придется использовать некоторые другие меры, чтобы решить это (например, показатель модульности разделов на каждом уровне дендрограммы).

  • fastgreedy.community - это еще один иерархический подход, но он снизу вверх, а не сверху вниз. Он пытается оптимизировать функцию качества, называемую модулярностью, жадным способом. Первоначально каждая вершина принадлежит отдельному сообществу, а сообщества объединяются итеративно таким образом, что каждое слияние является локально оптимальным (т.е. Дает наибольшее увеличение текущего значения модульности). Алгоритм останавливается, когда невозможно увеличить модульность, поэтому он дает вам группировку, а также дендрограмму. Метод выполняется быстро, и этот метод обычно используется в первом приближении, поскольку он не имеет параметров для настройки. Однако известно, что он страдает от предела разрешения, то есть сообщества ниже порога заданного размера (в зависимости от количества узлов и ребер, если я правильно помню) всегда будут объединены с соседними сообществами.

  • walktrap.community - это подход, основанный на случайных блужданиях. Общая идея состоит в том, что если вы выполняете случайные блуждания по графику, то прогулки чаще всего остаются в одном и том же сообществе, потому что всего лишь несколько ребер, которые выходят за пределы данного сообщества. Walktrap запускает короткие случайные блуждания 3-4-5 шагов (в зависимости от одного из его параметров) и использует результаты этих случайных блужданий, чтобы объединить отдельные сообщества снизу вверх, например fastgreedy.community. Опять же, вы можете использовать показатель модульности, чтобы выбрать, где вырезать дендрограмму. Это немного медленнее, чем быстрый жадный подход, но также немного более точный (согласно оригинальной публикации).

  • spinglass.community - это подход из статистической физики, основанный на так называемой модели Поттса. В этой модели каждая частица (т.е. Вершина) может находиться в одном из c-спиновых состояний, а взаимодействия между частицами (т.е. Ребрами графа) определяют, какие пары вершин предпочли бы оставаться в одном и том же состоянии спина, а какие предпочитают иметь разные спиновые состояния. Затем модель моделируется для заданного числа шагов, а спиновые состояния частиц в конечном итоге определяют сообщества. Последствия заключаются в следующем: 1) в конце концов не будет больше, чем c, хотя вы можете установить c до 200, что, вероятно, будет достаточно для ваших целей. 2) В конце концов, может быть меньше общин c, поскольку некоторые из состояний спина могут стать пустыми. 3) Не гарантируется, что узлы в полностью удаленных (или несогласованных) частях сетей имеют разные состояния спина. Это скорее всего будет проблемой для отключенных графиков, поэтому я бы не стал беспокоиться об этом. Этот метод не является особенно быстрым и не детерминированным (из-за самого моделирования), но имеет настраиваемый параметр разрешения, который определяет размеры кластера. Вариант метода spinglass также может принимать во внимание отрицательные ссылки (т.е. Ссылки, конечные точки которых предпочитают находиться в разных сообществах).

  • leading.eigenvector.community - это иерархический подход сверху вниз, который снова оптимизирует функцию модульности. На каждом шаге график разбивается на две части таким образом, что само разделение дает значительное увеличение модульности. Разбиение определяется оценкой ведущего собственного вектора так называемой матрицы модульности, а также условие остановки, которое препятствует дальнейшему разделению плотно связанных групп. Из-за собственных вычислений вектора он может не работать на вырожденных графах, где решатель собственных векторов ARPACK неустойчив. На невырожденных графах он, вероятно, даст более высокий показатель модульности, чем быстрый жадный метод, хотя он немного медленнее.

  • label.propagation.community - простой подход, при котором каждому node присваивается одна из k меток. Затем этот метод выполняется итеративно и повторно назначает метки узлам таким образом, что каждый node принимает самую частую метку своих соседей синхронно. Метод останавливается, когда метка каждого node является одной из наиболее частых меток в своей окрестности. Это очень быстро, но дает разные результаты, основанные на начальной конфигурации (которая определяется случайным образом), поэтому нужно многократно запускать метод (скажем, 1000 раз для графика), а затем создавать согласованную маркировку, которая может быть утомительно.

igraph 0.6 также будет включать в себя современный алгоритм обнаружения сообщества Infomap, основанный на теоретико-информационных принципах; он пытается построить группировку, которая обеспечивает кратчайшую длину описания для случайного блуждания на графике, где длина описания измеряется ожидаемым количеством бит на вершину, требуемой для кодирования пути случайного блуждания.

Во всяком случае, я бы, вероятно, пошел с fastgreedy.community или walktrap.community в первом приближении, а затем оценил другие методы, когда выяснилось, что по какой-то причине эти два не подходят для конкретной проблемы.

Ответ 2

Резюме различных алгоритмов обнаружения сообщества можно найти здесь: http://www.r-bloggers.com/summary-of-community-detection-algorithms-in-igraph-0-6/

Примечательно, что алгоритм InfoMAP является недавним новичком, который может быть полезен (он также поддерживает ориентированные графики).