Алгоритм Лувена для обнаружения сообществ (Louvain Method)
Материал из MachineLearning.
(Новая: {{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником Mariia Shubina 10:52,...) |
|||
| Строка 1: | Строка 1: | ||
| - | {{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником [[Участник:Mariia Shubina|Mariia Shubina]] 10: | + | {{well|Статья написана с использованием LLM Qwen3.7-Plus и проверена участником [[Участник:Mariia Shubina|Mariia Shubina]] 10:22, 19 июля 2026 (MSD)}} |
{{TOCright}} | {{TOCright}} | ||
| + | |||
== Введение == | == Введение == | ||
| - | + | '''Алгоритм Лувена''' (англ. ''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 на непересекающиеся подмножества (сообщества) | + | |
| - | C | + | === Формальная постановка задачи === |
| - | + | Пусть дан неориентированный взвешенный граф <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>. | |
| - | , | + | |
| - | + | Задача обнаружения сообществ заключается в разбиении множества вершин <tex>V</tex> на непересекающиеся подмножества (сообщества) <tex>C = \{c_1, c_2, \dots, c_k\}</tex> таким образом, чтобы связи внутри сообществ были значительно плотнее, чем связи между различными сообществами. | |
| - | + | ||
| - | , | + | === Модулярность Ньюмана-Гирвана === |
| - | + | Ключевой метрикой качества разбиения в алгоритме Лувена является модулярность <tex>Q</tex>, предложенная Ньюманом и Гирваном. Модулярность измеряет разность между долей рёбер внутри сообществ и математическим ожиданием этой доли в [[Нулевая модель|нулевой модели]] (модели конфигураций), которая сохраняет распределение степеней вершин, но соединяет их случайным образом. | |
| - | , | + | |
| - | + | Формула модулярности имеет вид: | |
| - | + | :: <tex>Q = \frac{1}{2m} \sum_{i,j} \left[ A_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)</tex> | |
| - | + | где <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 уже свидетельствуют о выраженной модульной структуре. | |
| - | + | ||
| - | + | === Приращение модулярности при перемещении узла === | |
| - | + | Основная вычислительная идея алгоритма заключается в эффективном расчёте изменения модулярности <tex>\Delta Q</tex> при перемещении вершины <tex>i</tex> из её текущего сообщества в соседнее сообщество <tex>C</tex>. | |
| - | + | ||
| - | + | Пусть <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>. | |
| - | + | ||
| - | + | Приращение модулярности при добавлении вершины <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> | |
| - | + | ||
| - | + | После алгебраических упрощений эта формула сводится к виду, который используется в практических реализациях для минимизации вычислений: | |
| - | + | :: <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> на сумму без учёта степени вершины). | |
| - | + | ||
| - | + | == Фазы алгоритма Лувена == | |
| - | + | Алгоритм работает итеративно и состоит из двух чередующихся фаз, которые применяются рекурсивно к агрегированным графам. | |
| - | + | ||
| - | + | === Фаза 1: Локальная оптимизация === | |
| - | + | На начальном этапе каждая вершина графа выделяется в собственное уникальное сообщество. Далее алгоритм выполняет следующие действия для каждой вершины <tex>i</tex>: | |
| - | + | # Рассматриваются все соседние сообщества вершины <tex>i</tex>. | |
| - | :: <tex>Q = \frac{1}{2m} \sum_{i,j} \left[ | + | # Для каждого соседнего сообщества вычисляется <tex>\Delta Q</tex>, которое получилось бы при перемещении <tex>i</tex> в это сообщество. |
| - | где | + | # Вершина <tex>i</tex> перемещается в то сообщество, которое обеспечивает максимальный положительный прирост <tex>\Delta Q > 0</tex>. Если ни одно перемещение не даёт положительного прироста, вершина остаётся в своём текущем сообществе. |
| - | + | # Процесс повторяется для всех вершин графа в определённом порядке до тех пор, пока за полный проход не будет сделано ни одного перемещения (достигнут локальный максимум модулярности). | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | ( | + | |
| - | + | ||
| - | + | ||
| - | , | + | |
| - | + | ||
| - | + | ||
| - | ) | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | i | + | |
| - | + | ||
| - | + | ||
| - | j | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | === | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | Q | + | |
| - | + | ||
| - | + | ||
| - | i из её текущего сообщества | + | |
| - | + | ||
| - | i | + | |
| - | i в сообщество | + | |
| - | C | + | |
| - | + | ||
| - | :: <tex>\Delta Q = \left[ \frac{\Sigma_{in} + | + | |
| - | + | ||
| - | + | ||
| - | i | + | |
| - | + | ||
| - | + | ||
| - | in | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | tot | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | i,in | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | i | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | i | + | |
| - | i. | + | |
| - | Вершина | + | |
| - | + | ||
| - | i перемещается в то сообщество | + | |
| - | + | ||
| - | Q | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
=== Фаза 2: Агрегация графа === | === Фаза 2: Агрегация графа === | ||
| - | После | + | После завершения первой фазы строится новый, агрегированный граф: |
| - | Каждое | + | * Каждое найденное сообщество становится новой ''супервершиной''. |
| - | Вес ребра между двумя супервершинами равен сумме весов всех рёбер между вершинами соответствующих сообществ в исходном графе. | + | * Вес ребра между двумя супервершинами равен сумме весов всех рёбер между вершинами соответствующих сообществ в исходном графе. |
| - | + | * Ребра, соединяющие вершины внутри одного сообщества, превращаются в петли (self-loops) супервершины, вес которых равен сумме внутренних рёбер сообщества. | |
| - | + | ||
| - | == | + | После построения агрегированного графа Фаза 1 применяется к нему снова. Процесс повторяется до тех пор, пока агрегация перестанет изменять структуру графа (количество супервершин не уменьшится) или не будет достигнут глобальный максимум модулярности. |
| - | + | ||
| - | + | == Псевдокод и вычислительная сложность == | |
| - | ( | + | |
| - | + | === Псевдокод === | |
| - | + | <pre> | |
| - | + | Вход: Граф 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 (начать новую итерацию для агрегированного графа) |
| - | O | + | </pre> |
| - | ( | + | |
| - | + | === Анализ вычислительной сложности === | |
| - | + | * '''Время''': Вычисление <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), впервые описанный Фортунато и Бартелеми в 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>. |
| - | + | ||
| - | + | Модулярность сравнивает фактическое число рёбер с математическим ожиданием в модели конфигураций. В очень больших сетях (<tex>m</tex> велико) ожидаемое число рёбер между двумя небольшими, но внутренне плотными сообществами может быть меньше 1. В результате объединение этих двух сообществ в одно формально увеличивает значение <tex>Q</tex>, даже если они структурно обособлены. Алгоритм Лувена, максимизируя <tex>Q</tex>, неизбежно сольёт такие мелкие сообщества, не позволяя обнаружить мелкомасштабную структуру. | |
| - | + | ||
| - | + | === Параметр разрешения <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 | + | |
| - | + | ||
| - | ) | + | |
| - | O(N | + | |
| - | 3 | + | |
| - | + | ||
| - | '''[[Распространение меток]] (Label Propagation)''': | + | |
| - | O | + | |
| - | ( | + | |
| - | M | + | |
| - | ) | + | |
| - | + | ||
| - | '''[[Алгоритм Лейден]]''': | + | |
== Ограничения метода == | == Ограничения метода == | ||
| - | + | Несмотря на популярность, классический алгоритм Лувена имеет ряд существенных ограничений: | |
| - | '''Недетерминированность''': Результат зависит от порядка обхода вершин на Фазе 1. Разные | + | # '''Недетерминированность''': Результат зависит от порядка обхода вершин на Фазе 1. Разные порядки могут приводить к различным локальным оптимумам модулярности. |
| - | ''' | + | # '''Риск застревания в локальных оптимумах''': Жадный характер перемещения вершин не гарантирует нахождения глобального максимума <tex>Q</tex>. Сообщества, однажды объединённые на ранних этапах агрегации, не могут быть разделены на последующих уровнях (проблема "необратимости агрегации"). |
| - | ''' | + | # '''Несвязные сообщества''': Из-за механизма агрегации супервершина на верхнем уровне может соответствовать набору вершин в исходном графе, которые не имеют путей связи друг с другом внутри этого сообщества. Это топологический артефакт, который нарушает интуитивное определение сообщества как связного подграфа. |
| + | |||
== Варианты и расширения == | == Варианты и расширения == | ||
| - | ''' | + | Для преодоления ограничений классического подхода были разработаны различные модификации: |
| - | + | * '''Динамический (инкрементальный) Лувен''': адаптирован для [[Временной граф|временных графов]]. Вместо полного перезапуска алгоритма при добавлении или удалении рёбер пересчитываются только значения <tex>\Delta Q</tex> для затронутых вершин и их соседей, что обеспечивает почти постоянное время обновления. | |
| - | + | * '''Многоуровневое рафинирование''': техники, при которых после завершения агрегации алгоритм "спускается" обратно к исходному графу, используя найденное разбиение как начальное приближение для повторной локальной оптимизации, что помогает выйти из локальных оптимумов. | |
| - | + | * '''Глубокие методы кластеризации графов (GNN)''': современные подходы, такие как Graph Autoencoders или методы на основе контрастивного обучения, не максимизируют модулярность напрямую, а обучают векторные представления вершин, сохраняя топологию. Они принципиально отличаются от Лувена, так как являются параметрическими и требуют обучения, но часто превосходят эвристические методы в задачах с богатыми признаками вершин. | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | [ | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | ] | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | Q | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | ''' | + | |
| - | ''' | + | |
== Литература == | == Литература == | ||
| - | + | * {{статья |автор = 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 | + | |
| - | }} | + | |
| - | {{статья | + | |
| - | |автор = | + | |
| - | |заглавие = | + | |
| - | |ссылка = https://doi.org/10. | + | |
| - | |издание = | + | |
| - | |тип = Журнал | + | |
| - | |год = | + | |
| - | |том = | + | |
| - | |номер = 1 | + | |
| - | |страницы = | + | |
| - | }} | + | |
| - | {{статья | + | |
| - | |автор = | + | |
| - | |заглавие = | + | |
| - | |ссылка = https://doi.org/10. | + | |
| - | |издание = | + | |
| - | |тип = Журнал | + | |
| - | |год = | + | |
| - | |том = | + | |
| - | |номер = 1 | + | |
| - | |страницы = | + | |
| - | }} | + | |
| - | {{книга | + | |
| - | |автор = Newman M. E. J. | + | |
| - | |заглавие = Networks: An Introduction | + | |
| - | |ссылка = https://doi.org/10.1093/acprof:oso/9780199206650.001.0001 | + | |
| - | |издательство = Oxford University Press | + | |
| - | |год = 2010 | + | |
| - | |страниц = | + | |
| - | }} | + | |
| - | </ | + | |
[[Категория:Анализ графов]] | [[Категория:Анализ графов]] | ||
[[Категория:Обнаружение сообществ]] | [[Категория:Обнаружение сообществ]] | ||
Текущая версия
| | Статья написана с использованием LLM Qwen3.7-Plus и проверена участником Mariia Shubina 10:22, 19 июля 2026 (MSD) |
|
Введение
Алгоритм Лувена (англ. Louvain method) — это эвристический метод для обнаружения сообществ в больших сетях, основанный на жадной оптимизации модулярности. Впервые предложенный в 2008 году Венсаном Блонделем и его коллегами, алгоритм получил широкое распространение благодаря своей вычислительной эффективности и способности выявлять иерархическую структуру в графах, содержащих миллионы вершин и рёбер[1].
Метод сочетает локальную оптимизацию с последующей иерархической агрегацией графа, что позволяет достигать высоких значений модулярности за время, близкое к линейному относительно числа рёбер. В данной статье приводится строгая математическая постановка задачи, детальный разбор фаз алгоритма, анализ его вычислительной сложности, а также обсуждение ограничений и современных расширений, включая переход к алгоритму Лейдена.
Постановка задачи и математические основы
Формальная постановка задачи
Пусть дан неориентированный взвешенный граф , где
— множество вершин (
), а
— множество рёбер (
). Граф описывается матрицей смежности
, где элемент
представляет собой вес ребра между вершинами
и
(для невзвешенных графов
). Степень вершины
обозначается как
, а общий вес всех рёбер в графе равен
.
Задача обнаружения сообществ заключается в разбиении множества вершин на непересекающиеся подмножества (сообщества)
таким образом, чтобы связи внутри сообществ были значительно плотнее, чем связи между различными сообществами.
Модулярность Ньюмана-Гирвана
Ключевой метрикой качества разбиения в алгоритме Лувена является модулярность , предложенная Ньюманом и Гирваном. Модулярность измеряет разность между долей рёбер внутри сообществ и математическим ожиданием этой доли в нулевой модели (модели конфигураций), которая сохраняет распределение степеней вершин, но соединяет их случайным образом.
Формула модулярности имеет вид:
где , если вершины
и
принадлежат одному сообществу, и
в противном случае. Слагаемое
представляет собой вероятность наличия ребра между
и
в модели конфигураций. Максимально возможное значение
близко к 1, хотя на практике для реальных сетей значения выше 0.3–0.7 уже свидетельствуют о выраженной модульной структуре.
Приращение модулярности при перемещении узла
Основная вычислительная идея алгоритма заключается в эффективном расчёте изменения модулярности при перемещении вершины
из её текущего сообщества в соседнее сообщество
.
Пусть — сумма весов рёбер внутри сообщества
, а
— сумма весов всех рёбер, инцидентных вершинам сообщества
. Обозначим через
сумму весов рёбер между вершиной
и вершинами сообщества
.
Приращение модулярности при добавлении вершины в сообщество
вычисляется как разность модулярности после и до перемещения:
После алгебраических упрощений эта формула сводится к виду, который используется в практических реализациях для минимизации вычислений:
Аналогичная формула применяется для расчёта выигрыша при удалении вершины из сообщества (с заменой на сумму весов рёбер к сообществу без учёта самой вершины, а
на сумму без учёта степени вершины).
Фазы алгоритма Лувена
Алгоритм работает итеративно и состоит из двух чередующихся фаз, которые применяются рекурсивно к агрегированным графам.
Фаза 1: Локальная оптимизация
На начальном этапе каждая вершина графа выделяется в собственное уникальное сообщество. Далее алгоритм выполняет следующие действия для каждой вершины :
- Рассматриваются все соседние сообщества вершины
.
- Для каждого соседнего сообщества вычисляется
, которое получилось бы при перемещении
в это сообщество.
- Вершина
перемещается в то сообщество, которое обеспечивает максимальный положительный прирост
. Если ни одно перемещение не даёт положительного прироста, вершина остаётся в своём текущем сообществе.
- Процесс повторяется для всех вершин графа в определённом порядке до тех пор, пока за полный проход не будет сделано ни одного перемещения (достигнут локальный максимум модулярности).
Фаза 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 (начать новую итерацию для агрегированного графа)
Анализ вычислительной сложности
- Время: Вычисление
для одной вершины требует знания только степеней и сумм весов рёбер соседних сообществ, что при правильной поддержке структур данных (например, хеш-таблиц для
и
) выполняется за время, пропорциональное степени вершины
. Полный проход по всем вершинам занимает время
. На практике алгоритм сходится за небольшое число проходов (обычно 2–5), а количество уровней иерархической агрегации логарифмически мало. Таким образом, общая временная сложность оценивается как
или даже
для разреженных графов, что делает метод одним из самых быстрых.
- Память: Требуется хранение исходного графа, структур для отслеживания сообществ и агрегированных графов на каждом уровне. Пространственная сложность составляет
, что позволяет обрабатывать графы с десятками миллионов рёбер на стандартном оборудовании.
Проблема предела разрешения
Одним из фундаментальных ограничений оптимизации модулярности является так называемый предел разрешения (resolution limit), впервые описанный Фортунато и Бартелеми в 2007 году[1].
Модулярность сравнивает фактическое число рёбер с математическим ожиданием в модели конфигураций. В очень больших сетях ( велико) ожидаемое число рёбер между двумя небольшими, но внутренне плотными сообществами может быть меньше 1. В результате объединение этих двух сообществ в одно формально увеличивает значение
, даже если они структурно обособлены. Алгоритм Лувена, максимизируя
, неизбежно сольёт такие мелкие сообщества, не позволяя обнаружить мелкомасштабную структуру.
Параметр разрешения
Для решения этой проблемы вводится параметр разрешения , модифицирующий формулу модулярности:
- При
мы получаем классическую модулярность.
- При
штраф за объединение сообществ увеличивается, что способствует обнаружению меньших и более плотных сообществ.
- При
алгоритм склонен формировать более крупные, укрупнённые сообщества.
Выбор оптимального зависит от предметной области и может осуществляться с помощью методов стабильности или кросс-валидации на графах.
Сравнение с другими методами
- Спектральная кластеризация: основана на поиске собственных векторов матрицы Лапласа графа. Обладает строгими теоретическими гарантиями, но имеет временную сложность
, что делает её неприменимой для больших сетей без использования аппроксимаций (например, метода Нистрома).
- Алгоритм Гирвана-Ньюмана: иерархический метод, удаляющий рёбра с наибольшей промежуточностью (betweenness centrality). Имеет сложность
или
для разреженных графов, что также ограничивает его применение малыми сетями, несмотря на высокую интерпретируемость.
- Распространение меток (Label Propagation): работает за время
, передавая метки соседям. Чрезвычайно быстр, но сильно недетерминирован и склонен к формированию одного гигантского сообщества (так называемого "monster community"), поглощающего большую часть графа.
- Алгоритм Лейден (Leiden algorithm): прямой современный преемник алгоритма Лувена, предложенный Траагом и др. в 2019 году[1]. Он добавляет фазу рафинирования (refinement) между локальной оптимизацией и агрегацией, что гарантирует связность всех выделяемых сообществ и часто приводит к более высоким значениям модулярности при сопоставимой вычислительной стоимости.
Ограничения метода
Несмотря на популярность, классический алгоритм Лувена имеет ряд существенных ограничений:
- Недетерминированность: Результат зависит от порядка обхода вершин на Фазе 1. Разные порядки могут приводить к различным локальным оптимумам модулярности.
- Риск застревания в локальных оптимумах: Жадный характер перемещения вершин не гарантирует нахождения глобального максимума
. Сообщества, однажды объединённые на ранних этапах агрегации, не могут быть разделены на последующих уровнях (проблема "необратимости агрегации").
- Несвязные сообщества: Из-за механизма агрегации супервершина на верхнем уровне может соответствовать набору вершин в исходном графе, которые не имеют путей связи друг с другом внутри этого сообщества. Это топологический артефакт, который нарушает интуитивное определение сообщества как связного подграфа.
Варианты и расширения
Для преодоления ограничений классического подхода были разработаны различные модификации:
- Динамический (инкрементальный) Лувен: адаптирован для временных графов. Вместо полного перезапуска алгоритма при добавлении или удалении рёбер пересчитываются только значения
для затронутых вершин и их соседей, что обеспечивает почти постоянное время обновления.
- Многоуровневое рафинирование: техники, при которых после завершения агрегации алгоритм "спускается" обратно к исходному графу, используя найденное разбиение как начальное приближение для повторной локальной оптимизации, что помогает выйти из локальных оптимумов.
- Глубокие методы кластеризации графов (GNN): современные подходы, такие как Graph Autoencoders или методы на основе контрастивного обучения, не максимизируют модулярность напрямую, а обучают векторные представления вершин, сохраняя топологию. Они принципиально отличаются от Лувена, так как являются параметрическими и требуют обучения, но часто превосходят эвристические методы в задачах с богатыми признаками вершин.
Литература
- Blondel V. D., Guillaume J. L., Lambiotte R., Lefebvre E. Fast unfolding of communities in large networks // 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 // Scientific Reports: Журнал. — 2019. — Т. 9. — № 1. — С. 5233.
- Fortunato S., Barthelemy M. Resolution limit in community detection // Proceedings of the National Academy of Sciences: Журнал. — 2007. — Т. 104. — № 1. — С. 36-41.
- Newman M. E. J. Networks: An Introduction. — Oxford University Press, 2010. — 754 с.

