Leiden 算法
1. 核心目标与背景
在知识图谱或任何复杂网络中,'社区结构'是指网络中的节点被划分为若干个组,组内连接密集,组间连接稀疏。检测社区结构有助于:
- 理解知识体系:发现图谱中高度相关、主题集中的子领域(例如,在学术图谱中找到'深度学习'社区和'数据库系统'社区)。
- 数据降维与可视化:将庞大的图谱分解为更小的、可管理的模块。
- 下游任务优化:为个性化推荐、异常检测、社区问答等任务提供先验结构信息。
Leiden 算法由 Traag、Waltman 和 van Eck 于 2019 年提出,旨在解决其前身——非常流行的Louvain 算法——所存在的主要缺陷。
2. Louvain 算法的简要回顾与缺陷
要理解 Leiden,必须先了解 Louvain。Louvain 算法是一种基于模块度优化的快速启发式算法,包含两个反复迭代的阶段:
- 模块度优化:遍历每个节点,尝试将其移动到邻居节点所在的社区,计算模块度增益(ΔQ)。如果最大增益为正,则将节点移动到使增益最大的社区。
- 社区聚合:将第一阶段形成的社区'折叠'成一个新的超节点,社区内部的边权重折叠为超节点的自环权重。然后在粗粒化后的新图上重复第一阶段。
Louvain 算法的主要缺陷:
- 分辨率限制:算法可能无法识别出比整个网络小得多的社区。
- 连接不良的社区:算法可能产生内部连接很弱甚至不连通的社区(即,一个社区可能由几个彼此没有连接的子部分组成),这在语义上是没有意义的。
- 结果随机性:算法对节点遍历顺序敏感,可能导致不同次运行得到差异较大的结果。
3. Leiden 算法的核心原理
Leiden 算法继承了 Louvain 的高效框架(两阶段迭代),但通过引入一个关键的'细化'阶段和更智能的移动策略,彻底解决了 Louvain 的缺陷。其核心流程也是三个阶段,但内涵不同:
第一阶段:局部节点移动
- 与 Louvain 类似,遍历节点并将其移动到能带来模块度增益的邻居社区。
- 关键改进 1:Leiden 算法允许在特定条件下进行零增益或负增益的移动(基于一个精妙的概率),这有助于算法摆脱局部最优解,找到全局更好的划分。
第二阶段:细化
- 这是 Leiden 算法的灵魂所在。在完成第一阶段并得到一组初步社区
{C}后,算法会对每个社区 C 进行内部重新划分。 - 它允许将社区 C 进一步细分为更小的子社区
{s}。 - 关键目标:保证在后续聚合后,每个子社区
s的内部连接是紧密的。这直接解决了 Louvain 产生'连接不良社区'的问题。 - 细化过程使用一个随机性的移动策略,但严格限制移动只能发生在当前社区 C 的内部,确保细化的结果是 C 的一个有效分割。
第三阶段:社区聚合
- 与 Louvain 不同,Leiden 不是基于第一阶段得到的社区
{C}进行聚合,而是基于细化阶段后产生的子社区{s}进行聚合。 - 每个子社区
s被折叠成一个新的超级节点。 - 关键意义:由于每个子社区
s内部都是连接良好的,这就保证了在后续迭代中,由超级节点代表的'社区'始终是内部连通的。

