Алгоритм Лувена для обнаружения сообществ (Louvain Method)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником Mariia Shubina 10:52,...)
 
Строка 1: Строка 1:
-
{{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником [[Участник:Mariia Shubina|Mariia Shubina]] 10:52, 19 июля 2026 (MSD)}}
+
{{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником [[Участник:Mariia Shubina|Mariia Shubina]] 10:22, 19 июля 2026 (MSD)}}
{{TOCright}}
{{TOCright}}
 +
== Введение ==
== Введение ==
-
[[Алгоритм Лувена]] (англ. ''Louvain Method'') — это быстрый эвристический метод для [[Обнаружение сообществ|обнаружения сообществ]] в больших сетях, основанный на жадной оптимизации [[Модулярность|модулярности]] графа. Метод был предложен в 2008 году исследователями из Католического университета Лувена (Бельгия) и стал одним из наиболее широко применяемых подходов в [[Анализ графов|анализе графов]] благодаря своей высокой вычислительной эффективности и способности выявлять иерархическую структуру сообществ.
+
'''Алгоритм Лувена''' (англ. ''Louvain method'') — это эвристический метод для [[Обнаружение сообществ|обнаружения сообществ]] в больших сетях, основанный на жадной оптимизации [[Модулярность|модулярности]]. Впервые предложенный в 2008 году Венсаном Блонделем и его коллегами, алгоритм получил широкое распространение благодаря своей вычислительной эффективности и способности выявлять иерархическую структуру в графах, содержащих миллионы вершин и рёбер<ref>{{статья |автор = Blondel V. D., Guillaume J. L., Lambiotte R., Lefebvre E. |заглавие = Fast unfolding of communities in large networks |ссылка = https://doi.org/10.1088/1742-5468/2008/10/P10008 |издание = Journal of Statistical Mechanics: Theory and Experiment |тип = Журнал |год = 2008 |том = 2008 |номер = 10 |страницы = P10008 }}</ref>.
-
Алгоритм не требует априорного знания числа сообществ и масштабируется на графы с миллионами вершин и рёбер, что делает его стандартом де-факто для задач кластеризации сетей в социальных науках, биоинформатике и рекомендательных системах.
+
 
-
== Формальная постановка задачи и интуиция ==
+
Метод сочетает локальную оптимизацию с последующей иерархической агрегацией графа, что позволяет достигать высоких значений модулярности за время, близкое к линейному относительно числа рёбер. В данной статье приводится строгая математическая постановка задачи, детальный разбор фаз алгоритма, анализ его [[Вычислительная сложность|вычислительной сложности]], а также обсуждение ограничений и современных расширений, включая переход к [[Алгоритм Лейден|алгоритму Лейдена]].
-
Задача обнаружения сообществ заключается в разбиении множества вершин графа
+
 
-
V
+
== Постановка задачи и математические основы ==
-
V на непересекающиеся подмножества (сообщества)
+
 
-
C
+
=== Формальная постановка задачи ===
-
1
+
Пусть дан неориентированный взвешенный граф <tex>G = (V, E)</tex>, где <tex>V</tex> — множество вершин (<tex>|V| = N</tex>), а <tex>E</tex> — множество рёбер (<tex>|E| = M</tex>). Граф описывается [[Матрица смежности|матрицей смежности]] <tex>A</tex>, где элемент <tex>A_{ij}</tex> представляет собой вес ребра между вершинами <tex>i</tex> и <tex>j</tex> (для невзвешенных графов <tex>A_{ij} \in \{0, 1\}</tex>). Степень вершины <tex>i</tex> обозначается как <tex>k_i = \sum_j A_{ij}</tex>, а общий вес всех рёбер в графе равен <tex>2m = \sum_{i,j} A_{ij}</tex>.
-
,
+
 
-
C
+
Задача обнаружения сообществ заключается в разбиении множества вершин <tex>V</tex> на непересекающиеся подмножества (сообщества) <tex>C = \{c_1, c_2, \dots, c_k\}</tex> таким образом, чтобы связи внутри сообществ были значительно плотнее, чем связи между различными сообществами.
-
2
+
 
-
,
+
=== Модулярность Ньюмана-Гирвана ===
-
+
Ключевой метрикой качества разбиения в алгоритме Лувена является модулярность <tex>Q</tex>, предложенная Ньюманом и Гирваном. Модулярность измеряет разность между долей рёбер внутри сообществ и математическим ожиданием этой доли в [[Нулевая модель|нулевой модели]] (модели конфигураций), которая сохраняет распределение степеней вершин, но соединяет их случайным образом.
-
,
+
 
-
C
+
Формула модулярности имеет вид:
-
k
+
:: <tex>Q = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)</tex>
-
C
+
где <tex>\delta(c_i, c_j) = 1</tex>, если вершины <tex>i</tex> и <tex>j</tex> принадлежат одному сообществу, и <tex>0</tex> в противном случае. Слагаемое <tex>\frac{k_i k_j}{2m}</tex> представляет собой вероятность наличия ребра между <tex>i</tex> и <tex>j</tex> в модели конфигураций. Максимально возможное значение <tex>Q</tex> близко к 1, хотя на практике для реальных сетей значения выше 0.3–0.7 уже свидетельствуют о выраженной модульной структуре.
-
1
+
 
-
+
=== Приращение модулярности при перемещении узла ===
-
,C
+
Основная вычислительная идея алгоритма заключается в эффективном расчёте изменения модулярности <tex>\Delta Q</tex> при перемещении вершины <tex>i</tex> из её текущего сообщества в соседнее сообщество <tex>C</tex>.
-
2
+
 
-
+
Пусть <tex>\Sigma_{in}</tex> — сумма весов рёбер внутри сообщества <tex>C</tex>, а <tex>\Sigma_{tot}</tex> — сумма весов всех рёбер, инцидентных вершинам сообщества <tex>C</tex>. Обозначим через <tex>k_{i,in}</tex> сумму весов рёбер между вершиной <tex>i</tex> и вершинами сообщества <tex>C</tex>.
-
,…,C
+
 
-
k
+
Приращение модулярности при добавлении вершины <tex>i</tex> в сообщество <tex>C</tex> вычисляется как разность модулярности после и до перемещения:
-
+
:: <tex>\Delta Q = \left[ \frac{\Sigma_{in} + 2k_{i,in}}{2m} - \left( \frac{\Sigma_{tot} + k_i}{2m} \right)^2 \right] - \left[ \frac{\Sigma_{in}}{2m} - \left( \frac{\Sigma_{tot}}{2m} \right)^2 - \left( \frac{k_i}{2m} \right)^2 \right]</tex>
-
таким образом, чтобы связи внутри сообществ были значительно плотнее, чем связи между различными сообществами.
+
 
-
В основе алгоритма Лувена лежит понятие модулярности
+
После алгебраических упрощений эта формула сводится к виду, который используется в практических реализациях для минимизации вычислений:
-
Q
+
:: <tex>\Delta Q = \frac{k_{i,in}}{m} - \frac{\Sigma_{tot} k_i}{2m^2}</tex>
-
Q, введённое Ньюманом и Гирваном. Модулярность измеряет разницу между долей рёбер внутри сообществ в реальной сети и ожидаемой долей таких рёбер в эталонной случайной сети (модель конфигураций) с тем же распределением степеней вершин.
+
 
-
Для взвешенного графа с [[Матрица смежности|матрицей весов]]
+
Аналогичная формула применяется для расчёта выигрыша при удалении вершины из сообщества (с заменой <tex>k_{i,in}</tex> на сумму весов рёбер к сообществу без учёта самой вершины, а <tex>\Sigma_{tot}</tex> на сумму без учёта степени вершины).
-
w
+
 
-
i
+
== Фазы алгоритма Лувена ==
-
j
+
Алгоритм работает итеративно и состоит из двух чередующихся фаз, которые применяются рекурсивно к агрегированным графам.
-
w
+
 
-
ij
+
=== Фаза 1: Локальная оптимизация ===
-
+
На начальном этапе каждая вершина графа выделяется в собственное уникальное сообщество. Далее алгоритм выполняет следующие действия для каждой вершины <tex>i</tex>:
-
модулярность определяется как:
+
# Рассматриваются все соседние сообщества вершины <tex>i</tex>.
-
:: <tex>Q = \frac{1}{2m} \sum_{i,j} \left[ w_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)</tex>
+
# Для каждого соседнего сообщества вычисляется <tex>\Delta Q</tex>, которое получилось бы при перемещении <tex>i</tex> в это сообщество.
-
где:
+
# Вершина <tex>i</tex> перемещается в то сообщество, которое обеспечивает максимальный положительный прирост <tex>\Delta Q > 0</tex>. Если ни одно перемещение не даёт положительного прироста, вершина остаётся в своём текущем сообществе.
-
m
+
# Процесс повторяется для всех вершин графа в определённом порядке до тех пор, пока за полный проход не будет сделано ни одного перемещения (достигнут локальный максимум модулярности).
-
=
+
 
-
1
+
-
2
+
-
+
-
i
+
-
,
+
-
j
+
-
w
+
-
i
+
-
j
+
-
m=
+
-
2
+
-
1
+
-
+
-
+
-
i,j
+
-
+
-
w
+
-
ij
+
-
+
-
— суммарный вес всех рёбер в графе;
+
-
k
+
-
i
+
-
=
+
-
+
-
j
+
-
w
+
-
i
+
-
j
+
-
k
+
-
i
+
-
+
-
=∑
+
-
j
+
-
+
-
w
+
-
ij
+
-
+
-
— взвешенная степень вершины
+
-
i
+
-
i;
+
-
c
+
-
i
+
-
c
+
-
i
+
-
+
-
— индекс сообщества, к которому принадлежит вершина
+
-
i
+
-
i;
+
-
δ
+
-
(
+
-
c
+
-
i
+
-
,
+
-
c
+
-
j
+
-
)
+
-
δ(c
+
-
i
+
-
+
-
,c
+
-
j
+
-
+
-
) — символ Кронекера, равный 1, если
+
-
c
+
-
i
+
-
=
+
-
c
+
-
j
+
-
c
+
-
i
+
-
+
-
=c
+
-
j
+
-
+
-
, и 0 в противном случае.
+
-
Интуиция метода заключается в итеративном локальном улучшении разбиения: алгоритм перемещает вершины между сообществами, если это увеличивает общую модулярность, а затем агрегирует найденные сообщества в супервершины, повторяя процесс на более высоком уровне абстракции.
+
-
== Математическое обоснование и алгоритм ==
+
-
Алгоритм состоит из двух чередующихся фаз, которые повторяются до тех пор, пока модулярность не перестанет расти.
+
-
=== Фаза 1: Локальное перемещение вершин ===
+
-
Изначально каждая вершина графа рассматривается как отдельное сообщество. Алгоритм последовательно перебирает все вершины
+
-
i
+
-
i. Для каждой вершины
+
-
i
+
-
i оценивается изменение модулярности
+
-
Δ
+
-
Q
+
-
ΔQ, которое произойдёт при удалении
+
-
i
+
-
i из её текущего сообщества и добавлении её в сообщество одной из её соседних вершин.
+
-
При перемещении вершины
+
-
i
+
-
i в сообщество
+
-
C
+
-
C изменение модулярности вычисляется по формуле:
+
-
:: <tex>\Delta Q = \left[ \frac{\Sigma_{in} + k_{i,in}}{2m} - \left( \frac{\Sigma_{tot} + k_i}{2m} \right)^2 \right] - \left[ \frac{\Sigma_{in}}{2m} - \left( \frac{\Sigma_{tot}}{2m} \right)^2 - \left( \frac{k_i}{2m} \right)^2 \right]</tex>
+
-
где:
+
-
Σ
+
-
i
+
-
n
+
-
Σ
+
-
in
+
-
+
-
— сумма весов рёбер внутри сообщества
+
-
C
+
-
C;
+
-
Σ
+
-
t
+
-
o
+
-
t
+
-
Σ
+
-
tot
+
-
+
-
— сумма весов всех рёбер, инцидентных вершинам сообщества
+
-
C
+
-
C;
+
-
k
+
-
i
+
-
,
+
-
i
+
-
n
+
-
k
+
-
i,in
+
-
+
-
— сумма весов рёбер между вершиной
+
-
i
+
-
i и вершинами сообщества
+
-
C
+
-
C;
+
-
k
+
-
i
+
-
k
+
-
i
+
-
+
-
— степень вершины
+
-
i
+
-
i.
+
-
Вершина
+
-
i
+
-
i перемещается в то сообщество соседа, которое обеспечивает максимальное положительное значение
+
-
Δ
+
-
Q
+
-
ΔQ. Если все возможные перемещения приводят к
+
-
Δ
+
-
Q
+
-
+
-
0
+
-
ΔQ≤0, вершина остаётся в своём текущем сообществе. Процесс повторяется обходом всех вершин до тех пор, пока не будет достигнуто состояние локального оптимума (ни одно перемещение не увеличивает
+
-
Q
+
-
Q).
+
=== Фаза 2: Агрегация графа ===
=== Фаза 2: Агрегация графа ===
-
После достижения локального оптимума строится новый укрупнённый граф:
+
После завершения первой фазы строится новый, агрегированный граф:
-
Каждое сообщество, найденное на Фазе 1, становится новой супервершиной.
+
* Каждое найденное сообщество становится новой ''супервершиной''.
-
Вес ребра между двумя супервершинами равен сумме весов всех рёбер между вершинами соответствующих сообществ в исходном графе.
+
* Вес ребра между двумя супервершинами равен сумме весов всех рёбер между вершинами соответствующих сообществ в исходном графе.
-
Вес петли (self-loop) супервершины равен сумме весов всех рёбер, соединяющих вершины внутри данного сообщества.
+
* Ребра, соединяющие вершины внутри одного сообщества, превращаются в петли (self-loops) супервершины, вес которых равен сумме внутренних рёбер сообщества.
-
Полученный граф передаётся на вход Фазы 1. Две фазы повторяются итеративно, формируя иерархию сообществ, до тех пор, пока модулярность не перестанет увеличиваться или граф не схлопнется в одну вершину.
+
 
-
== Вычислительная сложность ==
+
После построения агрегированного графа Фаза 1 применяется к нему снова. Процесс повторяется до тех пор, пока агрегация перестанет изменять структуру графа (количество супервершин не уменьшится) или не будет достигнут глобальный максимум модулярности.
-
'''Время''': В худшем случае [[Вычислительная сложность|сложность]] составляет
+
 
-
O
+
== Псевдокод и вычислительная сложность ==
-
(
+
 
-
N
+
=== Псевдокод ===
-
log
+
<pre>
-
+
Вход: Граф G = (V, E) с весами рёбер A_ij
-
N
+
Выход: Разбиение вершин на сообщества
-
)
+
 
-
O(NlogN) для разреженных графов, где
+
1. Инициализация: присвоить каждой вершине i уникальное сообщество c_i = i
-
N
+
2. Повторять:
-
N — число вершин. На практике алгоритм работает почти за линейное время
+
3. изменения = ложь
-
O
+
4. Для каждой вершины i в V (в случайном или фиксированном порядке):
-
(
+
5. удалить i из текущего сообщества
-
N
+
6. найти сообщество C, максимизирующее \Delta Q при добавлении i в C
-
+
+
7. если максимальное \Delta Q > 0:
-
M
+
8. переместить i в C
-
)
+
9. изменения = истина
-
O(N+M), где
+
10. если не изменения: прервать цикл (Фаза 1 завершена)
-
M
+
11. Построить агрегированный граф G' из найденных сообществ
-
M — число рёбер, благодаря тому, что на каждом последующем уровне агрегации размер графа экспоненциально уменьшается, а пересчёт
+
12. Если G' идентичен графу предыдущей итерации:
-
Δ
+
13. завершить алгоритм
-
Q
+
14. Иначе:
-
ΔQ выполняется только для локальных окрестностей.
+
15. G = G'
-
'''Память''': Требуется
+
16. перейти к шагу 2 (начать новую итерацию для агрегированного графа)
-
O
+
</pre>
-
(
+
 
-
N
+
=== Анализ вычислительной сложности ===
-
+
+
* '''Время''': Вычисление <tex>\Delta Q</tex> для одной вершины требует знания только степеней и сумм весов рёбер соседних сообществ, что при правильной поддержке структур данных (например, хеш-таблиц для <tex>\Sigma_{tot}</tex> и <tex>k_{i,in}</tex>) выполняется за время, пропорциональное степени вершины <tex>O(k_i)</tex>. Полный проход по всем вершинам занимает время <tex>O(M)</tex>. На практике алгоритм сходится за небольшое число проходов (обычно 2–5), а количество уровней иерархической агрегации логарифмически мало. Таким образом, общая временная сложность оценивается как <tex>O(M \log N)</tex> или даже <tex>O(N + M)</tex> для разреженных графов, что делает метод одним из самых быстрых.
-
M
+
* '''Память''': Требуется хранение исходного графа, структур для отслеживания сообществ и агрегированных графов на каждом уровне. Пространственная сложность составляет <tex>O(N + M)</tex>, что позволяет обрабатывать графы с десятками миллионов рёбер на стандартном оборудовании.
-
)
+
 
-
O(N+M) для хранения структуры графа и текущих назначений сообществ. Матрица смежности в явном виде не строится, используются списки смежности.
+
== Проблема предела разрешения ==
== Проблема предела разрешения ==
-
Одним из фундаментальных ограничений оптимизации модулярности является проблема предела разрешения (Resolution Limit), впервые описанная Фортунато и Бартелеми. Модулярность содержит глобальный масштабный параметр (общее число рёбер
+
Одним из фундаментальных ограничений оптимизации модулярности является так называемый ''предел разрешения'' (resolution limit), впервые описанный Фортунато и Бартелеми в 2007 году<ref>{{статья |автор = Fortunato S., Barthelemy M. |заглавие = Resolution limit in community detection |ссылка = https://doi.org/10.1073/pnas.0605965104 |издание = Proceedings of the National Academy of Sciences |тип = Журнал |год = 2007 |том = 104 |номер = 1 |страницы = 36-41 }}</ref>.
-
2
+
 
-
m
+
Модулярность сравнивает фактическое число рёбер с математическим ожиданием в модели конфигураций. В очень больших сетях (<tex>m</tex> велико) ожидаемое число рёбер между двумя небольшими, но внутренне плотными сообществами может быть меньше 1. В результате объединение этих двух сообществ в одно формально увеличивает значение <tex>Q</tex>, даже если они структурно обособлены. Алгоритм Лувена, максимизируя <tex>Q</tex>, неизбежно сольёт такие мелкие сообщества, не позволяя обнаружить мелкомасштабную структуру.
-
2m), из-за чего в больших сетях метод систематически объединяет небольшие, но структурно чётко выраженные сообщества в более крупные кластеры.
+
 
-
Математически два сообщества могут быть несправедливо объединены, если суммарное число рёбер между ними превышает ожидаемое число рёбер в случайном графе, даже если внутренняя связность этих сообществ высока. Это делает классический алгоритм Лувена менее пригодным для обнаружения мелких сообществ в гигантских сетях без дополнительной модификации (например, введения параметра разрешения
+
=== Параметр разрешения <tex>\gamma</tex> ===
-
γ
+
Для решения этой проблемы вводится параметр разрешения <tex>\gamma</tex>, модифицирующий формулу модулярности:
-
γ).
+
:: <tex>Q_\gamma = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \gamma \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)</tex>
 +
* При <tex>\gamma = 1</tex> мы получаем классическую модулярность.
 +
* При <tex>\gamma > 1</tex> штраф за объединение сообществ увеличивается, что способствует обнаружению меньших и более плотных сообществ.
 +
* При <tex>\gamma < 1</tex> алгоритм склонен формировать более крупные, укрупнённые сообщества.
 +
 
 +
Выбор оптимального <tex>\gamma</tex> зависит от предметной области и может осуществляться с помощью методов стабильности или кросс-валидации на графах.
 +
 
== Сравнение с другими методами ==
== Сравнение с другими методами ==
-
'''[[Спектральная кластеризация]]''': Обеспечивает строгие теоретические гарантии и хорошо работает на графах среднего размера, но требует вычисления [[Собственные значения|собственных векторов]] матрицы Лапласа, что имеет сложность
+
* '''[[Спектральная кластеризация]]''': основана на поиске собственных векторов матрицы Лапласа графа. Обладает строгими теоретическими гарантиями, но имеет временную сложность <tex>O(N^3)</tex>, что делает её неприменимой для больших сетей без использования аппроксимаций (например, метода Нистрома).
-
O
+
* '''Алгоритм Гирвана-Ньюмана''': иерархический метод, удаляющий рёбра с наибольшей ''промежуточностью'' (betweenness centrality). Имеет сложность <tex>O(N M^2)</tex> или <tex>O(N^3)</tex> для разреженных графов, что также ограничивает его применение малыми сетями, несмотря на высокую интерпретируемость.
-
(
+
* '''[[Распространение меток]] (Label Propagation)''': работает за время <tex>O(N + M)</tex>, передавая метки соседям. Чрезвычайно быстр, но сильно недетерминирован и склонен к формированию одного гигантского сообщества (так называемого "monster community"), поглощающего большую часть графа.
-
N
+
* '''[[Алгоритм Лейден]] (Leiden algorithm)''': прямой современный преемник алгоритма Лувена, предложенный Траагом и др. в 2019 году<ref>{{статья |автор = Traag V. A., Waltman L., van Eck N. J. |заглавие = From Louvain to Leiden: guaranteeing well-connected communities |ссылка = https://doi.org/10.1038/s41598-019-41695-z |издание = Scientific Reports |тип = Журнал |год = 2019 |том = 9 |номер = 1 |страницы = 5233 }}</ref>. Он добавляет фазу ''рафинирования'' (refinement) между локальной оптимизацией и агрегацией, что гарантирует связность всех выделяемых сообществ и часто приводит к более высоким значениям модулярности при сопоставимой вычислительной стоимости.
-
3
+
 
-
)
+
-
O(N
+
-
3
+
-
) и неприменимо для больших сетей.
+
-
'''Алгоритм Гирвана-Ньюмана''': Иерархический дивизивный метод, удаляющий рёбра с наибольшей промежуточностью (betweenness). Точен, но имеет сложность
+
-
O
+
-
(
+
-
N
+
-
3
+
-
)
+
-
O(N
+
-
3
+
-
), что делает его крайне медленным.
+
-
'''[[Распространение меток]] (Label Propagation)''': Работает за
+
-
O
+
-
(
+
-
M
+
-
)
+
-
O(M) и крайне быстр, но часто сходится к тривиальным решениям (одно гигантское сообщество) и обладает высокой стохастичностью.
+
-
'''[[Алгоритм Лейден]]''': Прямой преемник алгоритма Лувена. Исправляет главный структурный недостаток Лувена — возможность формирования несвязных (disconnected) сообществ на этапе агрегации, гарантируя, что все найденные сообщества являются слабо связными.
+
== Ограничения метода ==
== Ограничения метода ==
-
'''Несвязные сообщества''': Из-за жадного характера Фазы 1 и агрегации Фазы 2, алгоритм может сформировать сообщество, внутренние вершины которого не имеют путей друг к другу (разрывные сообщества).
+
Несмотря на популярность, классический алгоритм Лувена имеет ряд существенных ограничений:
-
'''Недетерминированность''': Результат зависит от порядка обхода вершин на Фазе 1. Разные запуски на одном и том же графе могут давать слегка различающиеся разбиения с близкими значениями модулярности.
+
# '''Недетерминированность''': Результат зависит от порядка обхода вершин на Фазе 1. Разные порядки могут приводить к различным локальным оптимумам модулярности.
-
'''Локальные оптимумы''': Жадная [[Эвристика|эвристика]] не гарантирует нахождение глобального максимума модулярности.
+
# '''Риск застревания в локальных оптимумах''': Жадный характер перемещения вершин не гарантирует нахождения глобального максимума <tex>Q</tex>. Сообщества, однажды объединённые на ранних этапах агрегации, не могут быть разделены на последующих уровнях (проблема "необратимости агрегации").
-
'''Предел разрешения''': Невозможность выявить мелкие сообщества в крупных графах без модификации функции оптимизации.
+
# '''Несвязные сообщества''': Из-за механизма агрегации супервершина на верхнем уровне может соответствовать набору вершин в исходном графе, которые не имеют путей связи друг с другом внутри этого сообщества. Это топологический артефакт, который нарушает интуитивное определение сообщества как связного подграфа.
 +
 
== Варианты и расширения ==
== Варианты и расширения ==
-
'''Модифицированная модулярность''': Введение параметра разрешения
+
Для преодоления ограничений классического подхода были разработаны различные модификации:
-
γ
+
* '''Динамический (инкрементальный) Лувен''': адаптирован для [[Временной граф|временных графов]]. Вместо полного перезапуска алгоритма при добавлении или удалении рёбер пересчитываются только значения <tex>\Delta Q</tex> для затронутых вершин и их соседей, что обеспечивает почти постоянное время обновления.
-
γ в формулу модулярности (
+
* '''Многоуровневое рафинирование''': техники, при которых после завершения агрегации алгоритм "спускается" обратно к исходному графу, используя найденное разбиение как начальное приближение для повторной локальной оптимизации, что помогает выйти из локальных оптимумов.
-
Q
+
* '''Глубокие методы кластеризации графов (GNN)''': современные подходы, такие как Graph Autoencoders или методы на основе контрастивного обучения, не максимизируют модулярность напрямую, а обучают векторные представления вершин, сохраняя топологию. Они принципиально отличаются от Лувена, так как являются параметрическими и требуют обучения, но часто превосходят эвристические методы в задачах с богатыми признаками вершин.
-
γ
+
 
-
=
+
-
1
+
-
2
+
-
m
+
-
+
-
i
+
-
,
+
-
j
+
-
[
+
-
w
+
-
i
+
-
j
+
-
+
-
γ
+
-
k
+
-
i
+
-
k
+
-
j
+
-
2
+
-
m
+
-
]
+
-
δ
+
-
(
+
-
c
+
-
i
+
-
,
+
-
c
+
-
j
+
-
)
+
-
Q
+
-
γ
+
-
+
-
=
+
-
2m
+
-
1
+
-
+
-
+
-
i,j
+
-
+
-
[w
+
-
ij
+
-
+
-
−γ
+
-
2m
+
-
k
+
-
i
+
-
+
-
k
+
-
j
+
-
+
-
+
-
+
-
]δ(c
+
-
i
+
-
+
-
,c
+
-
j
+
-
+
-
)) позволяет контролировать масштаб обнаруживаемых сообществ.
+
-
'''Динамический (инкрементальный) Лувен''': Методы, позволяющие обновлять разбиение графа при добавлении или удалении рёбер без полного перезапуска алгоритма, что критично для анализа временных сетей.
+
-
'''[[Алгоритм Лейден]]''': Современный стандарт, заменяющий Лувен в большинстве библиотек. Добавляет фазу "рафинирования" (refinement) между перемещением и агрегацией, что устраняет проблему несвязных сообществ и часто приводит к более высокому значению модулярности.
+
== Литература ==
== Литература ==
-
<references>
+
* {{статья |автор = Blondel V. D., Guillaume J. L., Lambiotte R., Lefebvre E. |заглавие = Fast unfolding of communities in large networks |ссылка = https://doi.org/10.1088/1742-5468/2008/10/P10008 |издание = Journal of Statistical Mechanics: Theory and Experiment |тип = Журнал |год = 2008 |том = 2008 |номер = 10 |страницы = P10008 }}
-
{{статья
+
* {{статья |автор = Traag V. A., Waltman L., van Eck N. J. |заглавие = From Louvain to Leiden: guaranteeing well-connected communities |ссылка = https://doi.org/10.1038/s41598-019-41695-z |издание = Scientific Reports |тип = Журнал |год = 2019 |том = 9 |номер = 1 |страницы = 5233 }}
-
|автор = Blondel V. D., Guillaume J. L., Lambiotte R., Lefebvre E.
+
* {{статья |автор = Fortunato S., Barthelemy M. |заглавие = Resolution limit in community detection |ссылка = https://doi.org/10.1073/pnas.0605965104 |издание = Proceedings of the National Academy of Sciences |тип = Журнал |год = 2007 |том = 104 |номер = 1 |страницы = 36-41 }}
-
|заглавие = Fast unfolding of communities in large networks
+
* {{книга |автор = Newman M. E. J. |заглавие = Networks: An Introduction |ссылка = https://doi.org/10.1093/acprof:oso/9780199206650.001.0001 |издательство = Oxford University Press |год = 2010 |страниц = 754 }}
-
|ссылка = https://doi.org/10.1088/1742-5468/2008/10/P10008
+
 
-
|издание = Journal of Statistical Mechanics: Theory and Experiment
+
<references/>
-
|тип = Журнал
+
 
-
|год = 2008
+
-
|том = 2008
+
-
|номер = 10
+
-
|страницы = P10008
+
-
}}
+
-
{{статья
+
-
|автор = Fortunato S., Barthelemy M.
+
-
|заглавие = Resolution limit in community detection
+
-
|ссылка = https://doi.org/10.1073/pnas.0605965104
+
-
|издание = Proceedings of the National Academy of Sciences
+
-
|тип = Журнал
+
-
|год = 2007
+
-
|том = 104
+
-
|номер = 1
+
-
|страницы = 36-41
+
-
}}
+
-
{{статья
+
-
|автор = Traag V. A., Waltman L., van Eck N. J.
+
-
|заглавие = From Louvain to Leiden: guaranteeing well-connected communities
+
-
|ссылка = https://doi.org/10.1038/s41598-019-41695-z
+
-
|издание = Scientific Reports
+
-
|тип = Журнал
+
-
|год = 2019
+
-
|том = 9
+
-
|номер = 1
+
-
|страницы = 5233
+
-
}}
+
-
{{книга
+
-
|автор = Newman M. E. J.
+
-
|заглавие = Networks: An Introduction
+
-
|ссылка = https://doi.org/10.1093/acprof:oso/9780199206650.001.0001
+
-
|издательство = Oxford University Press
+
-
|год = 2010
+
-
|страниц = 800
+
-
}}
+
-
</references>
+
[[Категория:Анализ графов]]
[[Категория:Анализ графов]]
[[Категория:Обнаружение сообществ]]
[[Категория:Обнаружение сообществ]]

Текущая версия

Статья написана с использованием LLM Qwen3.7-Plus и проверена участником Mariia Shubina 10:22, 19 июля 2026 (MSD)


Содержание

Введение

Алгоритм Лувена (англ. Louvain method) — это эвристический метод для обнаружения сообществ в больших сетях, основанный на жадной оптимизации модулярности. Впервые предложенный в 2008 году Венсаном Блонделем и его коллегами, алгоритм получил широкое распространение благодаря своей вычислительной эффективности и способности выявлять иерархическую структуру в графах, содержащих миллионы вершин и рёбер[1].

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

Постановка задачи и математические основы

Формальная постановка задачи

Пусть дан неориентированный взвешенный граф G = (V, E), где V — множество вершин (|V| = N), а E — множество рёбер (|E| = M). Граф описывается матрицей смежности A, где элемент A_{ij} представляет собой вес ребра между вершинами i и j (для невзвешенных графов A_{ij} \in \{0, 1\}). Степень вершины i обозначается как k_i = \sum_j A_{ij}, а общий вес всех рёбер в графе равен 2m = \sum_{i,j} A_{ij}.

Задача обнаружения сообществ заключается в разбиении множества вершин V на непересекающиеся подмножества (сообщества) C = \{c_1, c_2, \dots, c_k\} таким образом, чтобы связи внутри сообществ были значительно плотнее, чем связи между различными сообществами.

Модулярность Ньюмана-Гирвана

Ключевой метрикой качества разбиения в алгоритме Лувена является модулярность Q, предложенная Ньюманом и Гирваном. Модулярность измеряет разность между долей рёбер внутри сообществ и математическим ожиданием этой доли в нулевой модели (модели конфигураций), которая сохраняет распределение степеней вершин, но соединяет их случайным образом.

Формула модулярности имеет вид:

Q = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)

где \delta(c_i, c_j) = 1, если вершины i и j принадлежат одному сообществу, и 0 в противном случае. Слагаемое \frac{k_i k_j}{2m} представляет собой вероятность наличия ребра между i и j в модели конфигураций. Максимально возможное значение Q близко к 1, хотя на практике для реальных сетей значения выше 0.3–0.7 уже свидетельствуют о выраженной модульной структуре.

Приращение модулярности при перемещении узла

Основная вычислительная идея алгоритма заключается в эффективном расчёте изменения модулярности \Delta Q при перемещении вершины i из её текущего сообщества в соседнее сообщество C.

Пусть \Sigma_{in} — сумма весов рёбер внутри сообщества C, а \Sigma_{tot} — сумма весов всех рёбер, инцидентных вершинам сообщества C. Обозначим через k_{i,in} сумму весов рёбер между вершиной i и вершинами сообщества C.

Приращение модулярности при добавлении вершины i в сообщество C вычисляется как разность модулярности после и до перемещения:

\Delta Q = \left[ \frac{\Sigma_{in} + 2k_{i,in}}{2m} - \left( \frac{\Sigma_{tot} + k_i}{2m} \right)^2 \right] - \left[ \frac{\Sigma_{in}}{2m} - \left( \frac{\Sigma_{tot}}{2m} \right)^2 - \left( \frac{k_i}{2m} \right)^2 \right]

После алгебраических упрощений эта формула сводится к виду, который используется в практических реализациях для минимизации вычислений:

\Delta Q = \frac{k_{i,in}}{m} - \frac{\Sigma_{tot} k_i}{2m^2}

Аналогичная формула применяется для расчёта выигрыша при удалении вершины из сообщества (с заменой k_{i,in} на сумму весов рёбер к сообществу без учёта самой вершины, а \Sigma_{tot} на сумму без учёта степени вершины).

Фазы алгоритма Лувена

Алгоритм работает итеративно и состоит из двух чередующихся фаз, которые применяются рекурсивно к агрегированным графам.

Фаза 1: Локальная оптимизация

На начальном этапе каждая вершина графа выделяется в собственное уникальное сообщество. Далее алгоритм выполняет следующие действия для каждой вершины i:

  1. Рассматриваются все соседние сообщества вершины i.
  2. Для каждого соседнего сообщества вычисляется \Delta Q, которое получилось бы при перемещении i в это сообщество.
  3. Вершина i перемещается в то сообщество, которое обеспечивает максимальный положительный прирост \Delta Q > 0. Если ни одно перемещение не даёт положительного прироста, вершина остаётся в своём текущем сообществе.
  4. Процесс повторяется для всех вершин графа в определённом порядке до тех пор, пока за полный проход не будет сделано ни одного перемещения (достигнут локальный максимум модулярности).

Фаза 2: Агрегация графа

После завершения первой фазы строится новый, агрегированный граф:

  • Каждое найденное сообщество становится новой супервершиной.
  • Вес ребра между двумя супервершинами равен сумме весов всех рёбер между вершинами соответствующих сообществ в исходном графе.
  • Ребра, соединяющие вершины внутри одного сообщества, превращаются в петли (self-loops) супервершины, вес которых равен сумме внутренних рёбер сообщества.

После построения агрегированного графа Фаза 1 применяется к нему снова. Процесс повторяется до тех пор, пока агрегация перестанет изменять структуру графа (количество супервершин не уменьшится) или не будет достигнут глобальный максимум модулярности.

Псевдокод и вычислительная сложность

Псевдокод

Вход: Граф G = (V, E) с весами рёбер A_ij
Выход: Разбиение вершин на сообщества

1. Инициализация: присвоить каждой вершине i уникальное сообщество c_i = i
2. Повторять:
3.    изменения = ложь
4.    Для каждой вершины i в V (в случайном или фиксированном порядке):
5.        удалить i из текущего сообщества
6.        найти сообщество C, максимизирующее \Delta Q при добавлении i в C
7.        если максимальное \Delta Q > 0:
8.            переместить i в C
9.            изменения = истина
10.   если не изменения: прервать цикл (Фаза 1 завершена)
11. Построить агрегированный граф G' из найденных сообществ
12. Если G' идентичен графу предыдущей итерации:
13.    завершить алгоритм
14. Иначе:
15.    G = G'
16.    перейти к шагу 2 (начать новую итерацию для агрегированного графа)

Анализ вычислительной сложности

  • Время: Вычисление \Delta Q для одной вершины требует знания только степеней и сумм весов рёбер соседних сообществ, что при правильной поддержке структур данных (например, хеш-таблиц для \Sigma_{tot} и k_{i,in}) выполняется за время, пропорциональное степени вершины O(k_i). Полный проход по всем вершинам занимает время O(M). На практике алгоритм сходится за небольшое число проходов (обычно 2–5), а количество уровней иерархической агрегации логарифмически мало. Таким образом, общая временная сложность оценивается как O(M \log N) или даже O(N + M) для разреженных графов, что делает метод одним из самых быстрых.
  • Память: Требуется хранение исходного графа, структур для отслеживания сообществ и агрегированных графов на каждом уровне. Пространственная сложность составляет O(N + M), что позволяет обрабатывать графы с десятками миллионов рёбер на стандартном оборудовании.

Проблема предела разрешения

Одним из фундаментальных ограничений оптимизации модулярности является так называемый предел разрешения (resolution limit), впервые описанный Фортунато и Бартелеми в 2007 году[1].

Модулярность сравнивает фактическое число рёбер с математическим ожиданием в модели конфигураций. В очень больших сетях (m велико) ожидаемое число рёбер между двумя небольшими, но внутренне плотными сообществами может быть меньше 1. В результате объединение этих двух сообществ в одно формально увеличивает значение Q, даже если они структурно обособлены. Алгоритм Лувена, максимизируя Q, неизбежно сольёт такие мелкие сообщества, не позволяя обнаружить мелкомасштабную структуру.

Параметр разрешения \gamma

Для решения этой проблемы вводится параметр разрешения \gamma, модифицирующий формулу модулярности:

Q_\gamma = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \gamma \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)
  • При \gamma = 1 мы получаем классическую модулярность.
  • При \gamma > 1 штраф за объединение сообществ увеличивается, что способствует обнаружению меньших и более плотных сообществ.
  • При \gamma < 1 алгоритм склонен формировать более крупные, укрупнённые сообщества.

Выбор оптимального \gamma зависит от предметной области и может осуществляться с помощью методов стабильности или кросс-валидации на графах.

Сравнение с другими методами

  • Спектральная кластеризация: основана на поиске собственных векторов матрицы Лапласа графа. Обладает строгими теоретическими гарантиями, но имеет временную сложность O(N^3), что делает её неприменимой для больших сетей без использования аппроксимаций (например, метода Нистрома).
  • Алгоритм Гирвана-Ньюмана: иерархический метод, удаляющий рёбра с наибольшей промежуточностью (betweenness centrality). Имеет сложность O(N M^2) или O(N^3) для разреженных графов, что также ограничивает его применение малыми сетями, несмотря на высокую интерпретируемость.
  • Распространение меток (Label Propagation): работает за время O(N + M), передавая метки соседям. Чрезвычайно быстр, но сильно недетерминирован и склонен к формированию одного гигантского сообщества (так называемого "monster community"), поглощающего большую часть графа.
  • Алгоритм Лейден (Leiden algorithm): прямой современный преемник алгоритма Лувена, предложенный Траагом и др. в 2019 году[1]. Он добавляет фазу рафинирования (refinement) между локальной оптимизацией и агрегацией, что гарантирует связность всех выделяемых сообществ и часто приводит к более высоким значениям модулярности при сопоставимой вычислительной стоимости.

Ограничения метода

Несмотря на популярность, классический алгоритм Лувена имеет ряд существенных ограничений:

  1. Недетерминированность: Результат зависит от порядка обхода вершин на Фазе 1. Разные порядки могут приводить к различным локальным оптимумам модулярности.
  2. Риск застревания в локальных оптимумах: Жадный характер перемещения вершин не гарантирует нахождения глобального максимума Q. Сообщества, однажды объединённые на ранних этапах агрегации, не могут быть разделены на последующих уровнях (проблема "необратимости агрегации").
  3. Несвязные сообщества: Из-за механизма агрегации супервершина на верхнем уровне может соответствовать набору вершин в исходном графе, которые не имеют путей связи друг с другом внутри этого сообщества. Это топологический артефакт, который нарушает интуитивное определение сообщества как связного подграфа.

Варианты и расширения

Для преодоления ограничений классического подхода были разработаны различные модификации:

  • Динамический (инкрементальный) Лувен: адаптирован для временных графов. Вместо полного перезапуска алгоритма при добавлении или удалении рёбер пересчитываются только значения \Delta Q для затронутых вершин и их соседей, что обеспечивает почти постоянное время обновления.
  • Многоуровневое рафинирование: техники, при которых после завершения агрегации алгоритм "спускается" обратно к исходному графу, используя найденное разбиение как начальное приближение для повторной локальной оптимизации, что помогает выйти из локальных оптимумов.
  • Глубокие методы кластеризации графов (GNN): современные подходы, такие как Graph Autoencoders или методы на основе контрастивного обучения, не максимизируют модулярность напрямую, а обучают векторные представления вершин, сохраняя топологию. Они принципиально отличаются от Лувена, так как являются параметрическими и требуют обучения, но часто превосходят эвристические методы в задачах с богатыми признаками вершин.

Литература