社区检测算法leiden
1 介绍
Leiden 算法是一种用于在复杂网络中进行社区检测(Community Detection)的先进图聚类算法。它是在经典的 Louvain 算法基础上改进而来,旨在更高效、更高质量地识别网络中紧密连接的节点群组(即“社区”)。
# leidenalg开发文档
https://leidenalg.readthedocs.io/en/latest/index.html
# Github地址Python实现
https://github.com/vtraag/leidenalg
# Github地址C++实现
https://github.com/vtraag/libleidenalg
graspologic是一个图统计算法包(早期由微软维护),主要包括以下功能。
-
图嵌入 (Graph Embedding):将网络中的节点映射到低维向量空间,便于进行可视化和后续分析。支持单图和多图的多种嵌入方法。
-
统计推断 (Statistical Inference):提供假设检验工具,例如用于比较两个图是否存在显著差异的半参数检验。
-
数据预处理 (Preprocessing):包含针对图数据的清洗、规范化等操作,为后续分析做好准备。
-
聚类分析 (Clustering):提供适用于节点或图群体的聚类方法。
-
可视化 (Visualization):内置了用于展示图结构和高维数据的绘图函数。
# graspologic开发文档
https://graspologic-org.github.io/graspologic/latest/
# Github地址
https://github.com/graspologic-org/graspologic
2 使用leidenalg实现leiden算法
import igraph as ig
import leidenalg as la
# 1. 创建一个图 (这里使用igraph内置的Zachary空手道俱乐部图作为示例)
g = ig.Graph.Famous('Zachary')
# 2. 运行Leiden算法进行社区发现
# 这里使用基于模块度优化的分区方法
partition = la.find_partition(g, la.ModularityVertexPartition)
# 3. 查看结果
# partition.membership 是一个列表,表示每个节点所属的社区ID
print("节点社区归属:", partition.membership)
# 可以计算并打印此次划分的模块度,值越高代表社区结构越好
print("模块度:", partition.quality())
3 使用graspologic实现leiden算法
import networkx as nx
from graspologic.partition import hierarchical_leiden
# 1. 创建一个示例图 (这里使用 NetworkX 自带的空手道俱乐部数据)
graph = nx.karate_club_graph()
# 2. 使用 graspologic 进行层次化 Leiden 聚类
# max_cluster_size 控制每个社区的最大节点数,数值越小社区划分越细
community_mapping = hierarchical_leiden(
graph,
max_cluster_size=10,
random_seed=123
)
# 3. 查看结果
for partition in community_mapping:
# partition.node: 节点ID
# partition.cluster: 所属社区ID
# partition.level: 层级(0为最底层,数字越大层级越高)
print(f"节点 {partition.node} 属于社区 {partition.cluster}, 层级 {partition.level}")
1066

被折叠的 条评论
为什么被折叠?



