k-clique社区发现算法详解
k-clique社区发现算法是一种基于完全子图(clique)的重叠社区检测方法,由Palla等人于2005年提出。
它通过寻找图中相互重叠的k-clique结构来划分社区,允许节点同时属于多个社区。
核心概念
- k-clique:一个包含k个节点的完全子图,其中任意两个节点都直接相连。
- k-clique社区:一组k-clique的集合,其中任意两个clique可以通过一系列共享至少k−1k−1个节点的相邻clique连接起来。
算法步骤
- 寻找所有k-clique:枚举图中所有大小为k的完全子图。
- 构建重叠图:将每个k-clique视为一个节点,若两个k-clique共享至少k−1k−1个节点,则在它们之间连边。
- 提取连通分量:在重叠图中找到所有连通分量,每个连通分量对应一个k-clique社区。
- 合并节点集合:将同一连通分量中的k-clique包含的节点取并集,得到最终社区。
具体例子
假设有一个简单无向图(如图1),节点和边如下:
- 节点:A, B, C, D, E, F
- 边:AB, AC, BC, BD, CD, CE, DE, DF, EF
目标:使用k=3的k-clique算法划分社区。
步骤1:寻找所有3-clique
遍历图后,找到以下3-clique:
- Clique1: {A, B, C}(三角形ABC)
- Clique2: {B, C, D}(三角形BCD)
- Clique3: {C, D, E}(三角形CDE)
- Clique4: {D, E, F}(三角形DEF)
步骤2:构建重叠图
检查每对clique是否共享至少k−1=2k−1=2个节点:
- Clique1 & Clique2:共享B, C → 连边
- Clique2 & Clique3:共享C, D → 连边
- Clique3 & Clique4:共享D, E → 连边
- Clique1与其他clique无足够重叠。
重叠图结构:Clique1 — Clique2 — Clique3 — Clique4
步骤3:提取连通分量
连通分量为:{Clique1, Clique2, Clique3, Clique4}
步骤4:合并节点集合
合并所有clique的节点:
- 社区1: {A, B, C, D, E, F}
结果:整个图被划分为一个社区,因为所有clique通过共享节点连接。
应用场景
- 社交网络:发现用户群体,如兴趣小组通过共同好友形成社区。
- 生物网络:识别蛋白质相互作用中的功能模块。
- 推荐系统:基于用户行为重叠划分兴趣社区。
优缺点分析
| 优点 | 缺点 |
|---|---|
| 支持重叠社区检测 | 计算复杂度高(寻找所有k-clique是NP难问题) |
| 直观反映局部密集结构 | 对参数k敏感,k过小会导致大社区,k过大会漏掉社区 |
| 适合中小规模网络 | 不适用于稀疏图 |
代码示例(Python + NetworkX)
import networkx as nx
from networkx.algorithms.community import k_clique_communities
# 创建图
G = nx.Graph()
edges = [('A','B'), ('A','C'), ('B','C'), ('B','D'), ('C','D'),
('C','E'), ('D','E'), ('D','F'), ('E','F')]
G.add_edges_from(edges)
# 使用k=3检测社区
communities = list(k_clique_communities(G, 3))
# 输出结果
print("检测到的社区:")
for i, com in enumerate(communities, 1):
print(f"社区{i}: {', '.join(com)}")
输出:
检测到的社区:
社区1: A, B, C, D, E, F
通过上述分析,k-clique算法通过局部密集结构发现全局社区,特别适合存在重叠社区的真实网络。