HyperNetX 聚类实战:模块度与拉普拉斯谱聚类算法深度解析
【免费下载链接】HyperNetXPython package for hypergraph analysis and visualization.项目地址: https://gitcode.com/gh_mirrors/hy/HyperNetX
超图聚类是复杂网络分析中极具价值的工具,而 HyperNetX 作为 Python 生态中最专业的超图分析与可视化库,为超图聚类提供了开箱即用的完整解决方案。本文将以 HyperNetX 为例,深度解析两大核心算法:超图模块度聚类(Hypergraph Modularity)与拉普拉斯谱聚类(Spectral Clustering),帮助你理解它们的工作原理、适用场景,并快速上手实战。
什么是超图聚类?为什么要用它?
传统图聚类只允许一条边连接两个节点,而超图(Hypergraph)中的一条超边可以同时连接任意数量的节点,天然适合建模"多人会议"、"共同出演场景"、"文档-词项"这类多元关系。超图聚类就是要将这些节点划分成若干社区,使得超边内部的节点尽可能同属一个社区。
与把超图"压平"成普通图(2-section 图)再做图聚类相比,直接基于超图做聚类能保留高阶交互信息,往往能得到更符合直觉的社区结构。HyperNetX 的聚类模块位于 hypernetx/algorithms/clustering/,包含两条技术路线。
路线一:超图模块度聚类——优化 qH 指标
模块度(Modularity)是衡量社区划分质量的核心指标,超图模块度(记为 qH)将这一思想推广到了超图上。在 HyperNetX 中,核心实现位于 hypergraph_modularity.py。
模块度的核心思想:Edge Contribution 与 Degree Tax
qH 的计算分为两部分:
- Edge Contribution(边贡献):衡量"落在同一社区内的超边"带来的收益。对于一条包含 d 个节点、其中 c 个节点属于同一社区的边,通过权重函数 w(d,c) 给出贡献分数。
- Degree Tax(度罚项):基于配置模型(Chung-Lu 模型)的期望值,惩罚"随机划分也能碰巧形成的社区",防止过拟合。
三种内置权重函数,理解 qH 的关键
HyperNetX 内置了三种权重函数,对应不同的社区判定标准:
| 权重函数 | 判定规则 | 适用场景 |
|---|---|---|
linear | 多数节点同社区,贡献 c/d | 默认选项,平滑加权,适合大多数场景 |
majority | 多数节点同社区,贡献 1 | 二值化判定,边界更硬 |
strict | 全部节点同社区,贡献 1 | 最严格,只认可完全一致的社区 |
计算 qH 的调用非常简洁:
import hypernetx as hnx from hypernetx.algorithms.clustering import hypergraph_modularity as hmod # 构建超图:每条超边是一组共同出现的节点 scenes = { 0: ('FN', 'TH'), 1: ('TH', 'JV'), 2: ('BM', 'FN', 'JA'), 3: ('JV', 'JU', 'CH', 'BM'), } H = hnx.Hypergraph(scenes) # 定义一个划分:社区A 与 社区B A = [{'FN', 'TH', 'JV'}, {'BM', 'JA', 'JU', 'CH'}] # 计算超图模块度(默认 linear 权重) q = hmod.modularity(H, A) print(q)模块度数值越高,说明该划分的社区结构越"真实"。qH > 0 表示划分优于随机,qH < 0 则意味着划分质量较差。你还可以自定义权重函数(如(c/d)**2的二次权重)来适配特殊需求。
从划分到聚类:三大经典算法
有了 qH 这个目标函数,接下来就是寻找最优划分。HyperNetX 提供了三种策略:
- Kumar 算法(kumar()):先构建超图的 2-section 图,用 Louvain 算法得到初始社区,再迭代调整超边权重、重复聚类,直至收敛。
- Last-Step 算法(last_step()):在任意初始划分基础上,逐一尝试把节点移动到其他社区,只要 qH 能提升就采纳,类似图聚类的"贪心精修"。
- 自定义划分评估:你也可以手动构造划分,用
modularity()直接打分对比。
# 使用 Kumar 算法直接聚类 partition = hmod.kumar(H) # 或先用二段图聚类得到初始划分,再用 Last-Step 精修 init = hmod.dict2part({'FN': 0, 'TH': 0, 'JV': 0, 'BM': 1, 'JA': 1, 'JU': 1, 'CH': 1}) refined = hmod.last_step(H, init)路线二:拉普拉斯谱聚类——从随机游走出发
如果说模块度是"贪心优化",那么谱聚类则是"代数求解"。超图拉普拉斯谱聚类的实现位于 laplacians_clustering.py,理论源自 Hayashi 等人的经典论文Hypergraph random walks, Laplacians, and clustering(CIKM 2020)。
核心原理:三步构建谱聚类
谱聚类的精髓在于用矩阵的特征向量刻画社区结构,HyperNetX 的实现分三步:
- 构建随机游走概率转移矩阵 P:在超图上定义随机游走——先按权重选一条包含当前节点的超边,再在超边内按"边依赖顶点权重"选择下一跳。函数 prob_trans() 完成这一步。
- 构造归一化拉普拉斯矩阵 L:利用随机游走的平稳分布 π 对称化转移矩阵,得到归一化拉普拉斯,由 norm_lap() 实现。
- 特征分解 + K-Means:取 L 的 k 个最小特征值对应的特征向量,按行归一化后交给 K-Means 聚类,最终由 spec_clus() 输出
{簇编号: 节点列表}的字典。
一键调用:最简单的谱聚类入门
from hypernetx.algorithms.clustering import laplacians_clustering as lc # 构建 LesMis 场景超图(节点=人物,超边=同一场景出场) scenes = { 0: ('FN', 'TH'), 1: ('TH', 'JV'), 2: ('BM', 'FN', 'JA'), 3: ('JV', 'JU', 'CH', 'BM'), 4: ('JU', 'CH', 'BR', 'CN', 'CC', 'JV', 'BM'), 5: ('TH', 'GP'), 6: ('GP', 'MP'), 7: ('MA', 'GP'), } H = hnx.Hypergraph(scenes) # 聚类成 3 个社区,一步到位 clusters = lc.spec_clus(H, k=3) print(clusters)加权 vs 不加权:cell weights 的威力
拉普拉斯谱聚类的一大特色是支持边依赖顶点权重(即关联矩阵的 cell weights)。不加权时,随机游走等价于在超图 2-section 图(团展开)上的普通游走;一旦启用权重,随机游走可能不再可逆——这恰恰意味着它捕获了普通图无法表达的超图高阶结构。
启用权重只需一个参数:
# weights=True 时使用超图自带的 cell weights clusters_w = lc.spec_clus(H, k=3, weights=True)在教程clustering - Laplacians and Clustering.ipynb(位于 tutorials/advanced/)中,作者用 20newsgroups 数据集构造了"787 篇文档为顶点、20868 个词项为超边、TF-IDF 为 cell weights"的超图,比较了加权与不加权的聚类纯度,加权结果明显更优——这正体现了超图权重信息的价值。
两条路线怎么选?实战对比建议
| 对比维度 | 模块度聚类(qH) | 拉普拉斯谱聚类 |
|---|---|---|
| 数学基础 | 组合优化 + 配置模型 | 随机游走 + 特征分解 |
| 聚类数量 | 自动确定,无需指定 | 需手动指定 k |
| 权重支持 | 支持超边权重 | 支持 cell weights |
| 典型场景 | 社交网络、共现网络 | 文本聚类、生物网络 |
| 实现模块 | hypergraph_modularity.py | laplacians_clustering.py |
选型建议:如果你不确定社区数量、希望算法自动发现结构,优先尝试模块度路线(Kumar + Last-Step 组合);如果你已知目标类别数、且数据带有丰富的关联权重(如 TF-IDF、评分矩阵),谱聚类往往能给出更精准的边界。
总结:用 HyperNetX 开启超图聚类之旅
超图聚类正在成为推荐系统、生物信息、自然语言处理等领域的热门工具。HyperNetX 将复杂的数学理论封装成几个简单函数,让新手也能在几行代码内完成从超图构建到社区发现的完整流程:
- 模块度路线:
modularity()评估 +kumar()/last_step()聚类; - 谱聚类路线:
prob_trans()→norm_lap()→spec_clus()三步走。
相关的官方教程与源码都值得细细研读:Hypergraph Modularity 教程、Laplacians 教程 以及 clustering 模块。从一个小型共现超图开始动手实践吧,你会很快感受到超图聚类捕捉高阶关系时的强大威力!
【免费下载链接】HyperNetXPython package for hypergraph analysis and visualization.项目地址: https://gitcode.com/gh_mirrors/hy/HyperNetX
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考