引言
因为有 GraphRAG 的需求,其中涉及到了社区检测,因此也稍微看看这一领域中常用的 Louvain 算法和 Leiden 算法。本文内容主要是对论文 From Louvain to Leiden: guaranteeing well-connected communities 的简单分析解读,其中所提到的实验数据也是来源于此论文。
在复杂网络分析中,社区检测是理解网络结构的关键手段。在许多复杂网络中,节点会聚集并形成相对密集的群体------通常被称为社区。这种模块化结构通常事先是未知的。因此,检测网络中的社区是一个重要的问题。那么,如何评判社区检测结果好坏,因此需要一种衡量网络特定划分质量的标准,一般这个标准称为质量函数(quality function) ,**模块度(Modularity)和恒定波茨模型(Constant Potts Model,CPM)**是常用的社区质量评估函数。
理解质量函数
Modularity
社区检测中最著名的方法之一是模块化,其所使用的质量函数就是 Modularity,定义如下:
H = 1 2 m ∑ c ( e c − γ K c 2 2 m ) \mathcal{H}=\frac{1}{2 m} \sum_{c}\left(e_{c}-\gamma \frac{K_{c}^{2}}{2 m}\right) H=2m1c∑(ec−γ2mKc2)
其核心是通过"实际边数与随机情况下期望边数的差异"量化社区结构的优劣,用来评估一个网络划分成若干社区后,其内部连接是否显著强于随机预期。
核心参数定义
| 参数 | 数学含义 | 物理网络解释 |
|---|---|---|
| H \mathcal{H} H | Modularity值(模块化得分) | 衡量网络社区划分质量的指标,取值范围通常为 [ − 1 , 1 ] [-1,1] [−1,1],值越接近1,社区结构越显著。模块化方法的目标就是最大化这个值。 |
| m m m | 网络中总边数 | 描述网络整体的连接密度,是归一化因子,避免网络规模对得分的干扰 |
| c c c | 单个社区 | 网络中被划分出的一个"节点集群",所有社区构成网络的完整分区(无重叠、无遗漏) |
| e c e_c ec | 社区 c c c 内部的实际边数 | 反映社区内部的连接紧密程度, e c e_c ec 越大,社区内部越稠密 |
| K c K_c Kc | 社区 c c c 中所有节点的度数之和 | 描述社区 c c c 的"总连接能力",包含社区内部与外部的所有连接(如节点 v v v 的度数=其内部边数+外部边数) |
| γ \gamma γ | 分辨率参数( γ > 0 \gamma>0 γ>0) | 控制社区划分的精细度: γ \gamma γ 越大(高分辨率),倾向于拆分出更多小社区; γ \gamma γ 越小(低分辨率),倾向于合并为更少大社区 |
关键计算项简单说明
这里只是简单说明下公式中的几个计算项,没有深入研究细节及其推导。
-
期望边数项 K c 2 2 m \frac{K_{c}^{2}}{2m} 2mKc2 :
基于"配置模型"(Configuration Model)计算------假设网络节点度数固定,边随机连接时,社区 c c c 内部"理论上应存在的边数"。
-
社区贡献项 ( e c − γ K c 2 2 m ) \left(e_{c}-\gamma \frac{K_{c}^{2}}{2m}\right) (ec−γ2mKc2) :
单个社区 c c c 对整体模块化得分的"贡献值"。若 e c > γ K c 2 2 m e_c > \gamma \frac{K_c^2}{2m} ec>γ2mKc2,说明社区 c c c 内部实际边数超过随机期望,该社区的"结构显著性"为正;反之则为负(可能是划分不合理的社区)。
-
全局归一化 1 2 m \frac{1}{2m} 2m1 :
将所有社区的贡献项求和后进行归一化,确保模块化得分在统一尺度下可比,不受网络规模影响。
物理网络视角的本质意义
从网络结构的物理含义出发,Modularity本质是**"社区内部稠密连接"与"社区间稀疏连接"的量化差异**,核心作用是判断"某一分区是否真实反映了网络的内在社区结构",具体可从3个维度理解:
1. 区分"真实社区"与"随机集群"
在无真实社区结构的随机网络中,任意划分的"社区"内部边数 e c e_c ec 会接近期望边数 K c 2 2 m \frac{K_c^2}{2m} 2mKc2,此时 Modularity 值接近0;而在存在真实社区的网络中(如社交网络的"兴趣群组"、引文网络的"研究主题集群"),社区内部边数远多于随机期望,Modularity值会显著大于0,得分越高说明划分越贴合真实结构,越能体现社区性。
2. 平衡"社区粒度"与"结构显著性"
分辨率参数 γ \gamma γ 的物理意义是"社区密度阈值":
- 当 γ \gamma γ 较小时(如 γ = 0.1 \gamma=0.1 γ=0.1),低阈值允许更多节点被划入同一社区,即使社区内部密度较低(但仍高于随机期望),适合检测"宏观大社区"(如整个社交网络中的"地区群组");
- 当 γ \gamma γ 较大时(如 γ = 1 \gamma=1 γ=1),高阈值要求社区内部密度极高,仅允许紧密连接的节点构成社区,适合检测"微观小社区"(如地区群组中的"家庭子群")。
3. 规避"规模依赖"的公平对比
通过 1 2 m \frac{1}{2m} 2m1 的归一化,Modularity可在不同规模的网络间公平比较社区结构质量。例如:
- 小网络(如100节点、200条边)与大网络(如10000节点、20000条边)的Modularity得分可直接对比,无需担心"大网络边数多导致得分偏高"的问题;
- 同一网络的不同分区方案(如A方案分5个社区,B方案分10个社区),可通过Modularity值判断哪种方案更优。
Constant Potts Model
使用模块度作为质量函数时会有所谓的分辨率限制问题。由于分辨率限制,也就是 Modularity 中的期望边数 K c 2 2 m \frac{K_{c}^{2}}{2m} 2mKc2 依赖网络总边数 m m m,当社区规模远小于网络整体规模时,即使该社区内部连接极稠密,其对 Modularity 总分的 "贡献" 也可能被 "大社区的贡献" 淹没,导致算法无法识别出小社区。换句话说,模块化可能会"隐藏"较小的社区,而产生包含重要子结构的社区。
CPM 通过使用不同的参考基准避免了这个问题,其定义如下:
H = ∑ c [ e c − γ ( n c 2 ) ] \mathcal{H}=\sum_{c}\left[e_{c}-\gamma \binom{n_c}{2}\right] H=c∑[ec−γ(2nc)]
其中, n c n_{c} nc 是社区 c c c 中的节点数量。分辨率参数 γ \gamma γ 起到一种阈值的作用:社区的密度应至少为 γ \gamma γ,而社区之间的密度应低于 γ \gamma γ。与模块化的分辨率参数类似,较高的分辨率会产生更多的社区,较低的分辨率则会产生更少的社区。
可以看到,CPM 的参考基准是"社区自身的最大可能边数 ( n c 2 ) \binom{n_c}{2} (2nc)",与网络整体规模(总节点数、总边数)无关,仅依赖社区内部节点数 n c n_c nc。因此,无论社区规模大小,只要内部密度 ≥ γ ≥ \gamma ≥γ,就能被识别为有效社区,避免了 Modularity"漏检小社区"的问题。
Louvain 算法
直接优化模块度或 CPM 等质量函数是NP难问题,因此人们提出了许多启发式算法,在这些算法中,最受欢迎的算法之一就是所谓的Louvain算法,其名称来源于作者所在的地点。在对比分析中,该算法被发现是速度最快、性能最佳的算法之一,并且是社区检测文献中被引用次数最多的研究成果之一。
核心流程
Louvain 算法非常简单巧妙,其通过 "节点的局部移动 - 网络聚合" 的两阶段迭代来优化质量函数,流程如下:
- 初始状态:每个节点为独立社区(单点分区);
- 局部移动阶段:逐个移动节点到能使质量函数获得最大增幅的社区中,直至无节点可优化移动;
- 网络聚合阶段:基于局部移动阶段得到的分区创建一个聚合网络,分区中的每个社区作为聚合网络中的一个节点;
- 迭代终止:重复 "局部移动 - 聚合",直至质量函数无法提升。
整体算法流程图和伪代码(来自原论文)如下所示:


算法缺陷
虽然 Louvain 算法简单优雅,但其却存在严重缺陷:
- 社区连通性差:可能产生任意程度的连通性不佳的社区,极端情况下甚至出现完全不连通的社区(部分节点需通过社区外路径才能连通)。分析显示,Louvain 发现的社区中,高达 25% 的社区连接不良,多达 16% 实际上是断开的。
- 迭代加剧问题:迭代运行时,虽能提升质量函数值,但会进一步恶化社区连通性。这是因为算法仅考虑单个节点移动,可能移除社区 "桥节点" 导致社区离散,且无修复机制。
- 与分辨率限制无关:该缺陷独立于模块化的分辨率限制问题,即使使用无分辨率限制的 CPM 函数,问题仍存在。
比如,像下图所示的情况,0~6 节点在同一个社区中(红色表示),1~3 节点和 4~6 节点仅靠 0 节点连通,而 Louvain 算法运行,移动网络中其余部分中的节点。可能在某个时刻,算法发现,将节点 0 移动到其他社区是最优的选择,然后将节点 0 从红色社区中移除掉后,就形成了右图所示的情况,也就是得到了一个内部不连通的社区。

Leiden 算法
Leiden 算法正是为了解决 Louvain 算法的缺陷而提出来的一种改进的算法,其能保证社区具有良好的连通性。
核心流程
Leiden 算法的核心流程可分为以下三个阶段,以及各阶段与 Louvain 算法的比较:
| 阶段 | 核心操作 | 与Louvain算法的差异 |
|---|---|---|
| 1. 节点局部移动 | 采用"快速局部移动"策略:用队列维护需访问的节点,仅重新访问邻居结构变化的节点,避免重复访问无变化节点 | Louvain 每一次均需遍历所有节点直至无优化空间,效率低;Leiden减少无效访问,速度更快 |
| 2. 分区细化 | 基于阶段1的分区 P P P,生成细化分区 P r e f i n e d P_{refined} Prefined: 1. 初始为单节点分区; 2. 仅在 P P P 的社区内部合并节点,且合并需满足"与原社区充分连通"; 3. 随机选择合并目标( 使用变量 θ \theta θ 控制随机性),合并目标需为质量提升大于 0 的社区 | Louvain无细化阶段,直接基于 P P P 聚合网络,可能保留连通性差的社区 |
| 3. 网络聚合 | 基于 P r e f i n e d P_{refined} Prefined 构建聚合网络,且聚合网络的初始分区仍基于 P P P | Louvain直接基于 P P P 聚合,无法修复已有缺陷 |
整体算法流程图和伪代码如下所示:


算法性能保证
Leiden算法提供了多层级的理论保证,显著优于Louvain算法,具体对比如下:
γ \gamma γ 指的是待优化质量函数中的分辨率参数,该质量函数可以是模块化函数或CPM。
| 保证类型 | Louvain算法 | Leiden算法 |
|---|---|---|
| 每轮迭代 | ✅ γ \gamma γ-分离(无社区可合并) | ✅ γ \gamma γ-分离; ✅ γ \gamma γ-连通(社区保证连通,强于普通连通性) |
| 稳定迭代(分区无变化) | ✅ 节点最优(无单个节点可优化移动) | ✅ 节点最优; ✅ 子分区 γ \gamma γ-稠密(社区可拆分为连通子部分,且子部分无法与原社区分离) |
| 渐近收敛(迭代至无优化空间) | ❌ 无额外保证(稳定后无法进一步优化) | ✅ 均匀 γ \gamma γ-稠密(社区任意子集均无法与原社区分离,质量接近最优); ✅ 子集最优(社区所有子集均无法优化移动,最强保证) |
实验验证结果
研究在6个真实网络(DBLP、Amazon、IMDB等)和基准网络上验证算法性能,核心结论如下:
1. 连通性改善
- Louvain算法:迭代次数增加后,离散社区比例显著上升(如DBLP网络迭代后离散社区达16%,Amazon网络25%社区连通性差)。
- Leiden算法:
- 保证所有社区连通;
- 迭代次数增加时,连通性差的社区比例持续下降,最终收敛到无连通性问题的分区。
2. 速度提升
- 基准网络:节点数越多、社区划分难度越大( μ \mu μ 越大, μ \mu μ 为边在社区间的概率),Leiden优势越明显。例如 μ = 0.9 \mu=0.9 μ=0.9(最难划分)、节点数 n = 10 7 n=10^7 n=107 时,Louvain需2.5天,Leiden仅需10分钟。
- 真实网络:Leiden比Louvain快2-20倍,大型网络(如Web UK)速度差距达20倍。
3. 分区质量优化
- 基准网络: μ \mu μ 较大时,Leiden生成的分区质量更高(CPM质量函数值更高)。
- 真实网络:所有网络中,Leiden的模块度均高于Louvain(如Amazon网络Louvain 模块度 0.9301,Leiden 达 0.9341),且迭代中持续优化,而Louvain快速收敛到次优解。
总结
总的来说,Leiden 算法通过几个关键操作,避免了 Louvain 算法的社区内连通性缺陷,并且极大地提升了算法效率:
- 采用"快速局部移动"策略,仅需重新访问被移动节点的相关邻居节点,避免重复访问无变化节点,从而提高了分区优化效率;
- 对快速局部移动节点得到的分区进行细分,如果原分区的社区内有连通性差的部分,则会原社区会分裂为多个社区;
- 网络聚合是基于细分后的分区进行的,而聚合后的网络的初始分区还是快速局部移动得到的分区,这样既保证当前迭代的最优分区,又使得社区内的不连通子社区(聚合网络中的节点)能有重新被移动的机会,从而确保社区连通性。