COMP5313 Assignment 2 - Task 2 题解
Assignment 2 - Task 2:Community Detection
题目理解
Task 2 要求在给定网络中识别社区结构,分析网络的模块化程度,并比较不同社区检测算法的性能。
核心目标: 1. 实现或应用社区检测算法(Girvan-Newman、Louvain 等) 2. 计算 Modularity 评估社区质量 3. 可视化社区划分结果 4. 分析不同参数对检测结果的影响
关键概念回顾
Modularity (Q)
Modularity 衡量社区划分的好坏,定义为:
\[Q = \frac{1}{2m} \sum_{ij} \left[ A_{ij} - \frac{k_i k_j}{2m} \right] \delta(c_i, c_j)\]
其中: - \(m\) = 网络总边数 - \(A_{ij}\) = 邻接矩阵元素 - \(k_i, k_j\) = 节点 \(i, j\) 的度 - \(\delta(c_i, c_j)\) = 1 如果 \(i, j\) 在同一社区,否则为 0
Interpretation: - \(Q > 0.3\):显著的社区结构 - \(Q > 0.7\):很强的社区结构 - \(Q \approx 0\):没有明显的社区结构(接近随机网络)
Girvan-Newman Algorithm
核心思想: 逐步移除边介数(betweenness)最高的边,直到网络分裂成社区。
算法步骤: 1. 计算所有边的 betweenness centrality 2. 移除 betweenness 最高的边 3. 重新计算受影响边的 betweenness 4. 重复直到满足停止条件 5. 在 dendrogram 上选择使 Modularity 最大的划分
时间复杂度: \(O(m^2 n)\),适合中等规模网络。
Louvain Algorithm
核心思想: 贪心优化 Modularity,两阶段迭代:
Phase 1: 局部移动 - 每个节点初始为独立社区 - 对每个节点,尝试移动到邻居社区,选择使 ΔQ 最大的移动 - 重复直到无法改进
Phase 2: 网络聚合 - 将每个社区压缩为超级节点 - 重新计算边权重 - 重复 Phase 1
时间复杂度: \(O(n \log n)\),适合大规模网络。
Python 实现
基础设置与数据加载
import networkx as nx |
Girvan-Newman 实现
def edge_betweenness(G): |
Louvain 算法(使用库)
# 使用 python-louvain 库 |
可视化
def visualize_communities(G, partition, title="Community Structure", |
结果分析
Modularity 随迭代变化(Girvan-Newman)
# 绘制 Q 值变化曲线 |
社区统计特征
def analyze_communities(G, partition): |
完整运行流程
def main(): |
常见问题与优化
Q1: Girvan-Newman 太慢怎么办?
优化策略: 1. 限制迭代次数:设置
max_iter 提前停止 2. 采样计算
betweenness:对大规模网络,随机采样节点计算 3.
使用近似算法:NetworkX 的
nx.edge_betweenness_centrality() 有 k
参数可采样 4. 换用 Louvain:对于 \(n > 1000\) 的网络,Louvain 更适合
# 使用 NetworkX 内置的近似 betweenness(更快) |
Q2: 如何确定最优社区数量?
方法: - Modularity 最大化:最直接的方法 - 肘部法则:Plot Q vs. #communities,找拐点 - 分辨率参数:Louvain 可调整 resolution 参数控制社区粒度
# Louvain 不同 resolution |
Q3: 社区划分不稳定怎么办?
原因: 算法随机性或网络本身模糊的结构。
解决方案: 1. 多次运行取平均:集成多个划分结果 2. 使用确定性的初始化:设置随机种子 3. 考虑重叠社区:使用 OSLOM 或 COPRA 等支持重叠社区的算法
评分要点
根据 Assignment 2 常见评分标准,确保涵盖:
| 评分项 | 权重 | 检查点 |
|---|---|---|
| 算法实现 | 30% | 代码正确性、效率、可读性 |
| Modularity 计算 | 20% | 正确实现公式,结果合理 |
| 结果分析 | 25% | 社区统计、比较、可视化 |
| 报告质量 | 15% | 结构清晰、解释充分 |
| 创新/优化 | 10% | 额外分析、算法改进 |
加分项: - 对比 3+ 种不同算法 - 分析 resolution parameter 的影响 - 对结果进行统计显著性检验 - 实现可视化交互(如使用 Plotly)
参考资源
- NetworkX 文档: https://networkx.org/documentation/stable/
- python-louvain: https://github.com/taynaud/python-louvain
- 论文: Newman, M. E. J. (2004). "Fast algorithm for detecting community structure in networks"
- 论文: Blondel et al. (2008). "Fast unfolding of communities in large networks"
Last Updated: 2026-04-19
Status: ✅ Complete