COMP5313 Assignment 2 - Task 1 题解
Assignment 2 - Task 1:Link Prediction
题目理解
Task 1 要求在给定网络中实现并评估多种链接预测算法,预测未来可能出现的边。
核心目标: 1. 实现多种基于节点相似度的链接预测算法 2. 在训练/测试集上评估预测性能 3. 比较不同算法的准确率、精确率、召回率等指标 4. 分析网络结构特征对预测效果的影响
关键概念回顾
链接预测的定义
给定网络 \(G = (V, E)\),链接预测问题旨在预测未来可能出现的边 \((u, v) \notin E\)。
两种评估方式: 1. 时序分割:用时间 \(t\) 前的边训练,\(t\) 后的边测试 2. 随机分割:随机划分边为训练集和测试集
基于节点相似度的指标
设 \(\Gamma(u)\) 为节点 \(u\) 的邻居集合。
1. Common Neighbors (CN)
\[CN(u, v) = |\Gamma(u) \cap \Gamma(v)|\]
最简单的指标:共同邻居越多,越可能相连。
2. Jaccard Coefficient (JC)
\[JC(u, v) = \frac{|\Gamma(u) \cap \Gamma(v)|}{|\Gamma(u) \cup \Gamma(v)|}\]
归一化后的共同邻居,消除度的影响。
3. Adamic-Adar Index (AA)
\[AA(u, v) = \sum_{w \in \Gamma(u) \cap \Gamma(v)} \frac{1}{\log k_w}\]
对高度数节点惩罚(高度数节点的信息量较少)。
4. Preferential Attachment (PA)
\[PA(u, v) = k_u \times k_v\]
度越高的节点越容易获得新连接(富者愈富)。
5. Resource Allocation (RA)
\[RA(u, v) = \sum_{w \in \Gamma(u) \cap \Gamma(v)} \frac{1}{k_w}\]
与 AA 类似但惩罚更强(\(1/k_w\) vs \(1/\log k_w\))。
评估指标
| 指标 | 定义 | 适用场景 |
|---|---|---|
| AUC | 随机未连接边得分 < 随机连接边得分的概率 | 整体排序能力 |
| Precision@K | 前 K 个预测中正确的比例 | Top-K 应用 |
| Recall | 正确预测数 / 总实际新增边数 | 覆盖率 |
| F1-Score | 2 × Precision × Recall / (Precision + Recall) | 综合性能 |
Python 实现
基础设置与数据加载
import networkx as nx |
链接预测指标实现
def common_neighbors(G, u, v): |
生成候选边
def generate_candidates(G_train, test_edges, non_edge_sample_ratio=10): |
评估函数
def evaluate_predictor(df, score_column): |
Katz 指标(更复杂的算法)
def katz_index(G, beta=0.01, max_iter=100, tol=1e-6): |
局部路径索引(考虑更多跳)
def local_path_index(G, u, v, epsilon=0.01): |
完整实验流程
def run_link_prediction_experiment(network_path, test_ratio=0.2): |
结果分析与讨论
典型结果示例
假设在 Zachary's Karate Club 网络上的典型结果:
| Method | AUC | Precision@K | PR-AUC | Notes |
|---|---|---|---|---|
| AA | 0.954 | 0.892 | 0.821 | 最佳综合表现 |
| RA | 0.951 | 0.885 | 0.815 | 与 AA 接近 |
| JC | 0.948 | 0.876 | 0.808 | 对高度数节点友好 |
| CN | 0.932 | 0.845 | 0.775 | 基础指标 |
| PA | 0.712 | 0.523 | 0.498 | 对无标度网络有效 |
分析讨论点
- 为什么 AA/RA 通常表现最好?
- 对高度数节点给予较低权重
- 考虑了节点的信息量差异
- 在稀疏网络上也能给出有意义的分数
- PA 为什么表现较差?
- 只考虑度的乘积,忽略拓扑结构
- 对均匀度网络效果差
- 但在 BA 模型生成的网络上可能表现较好
- 什么情况下 CN 足够?
- 网络规模很大,计算资源有限
- 网络度分布相对均匀
- 需要快速基线时
- 如何进一步提升?
- 使用全局特征(Katz, PageRank, SimRank)
- 加入节点属性(如果有)
- 集成学习方法
常见问题与优化
Q1: 网络太大,O(n²) 候选边生成太慢?
解决方案: 1. 只考虑共同邻居 > 0 的节点对(预过滤) 2. 使用稀疏矩阵操作 3. 采样而非枚举所有候选边
def generate_candidates_fast(G_train, test_edges, n_samples=10000): |
Q2: 不同 test_ratio 对结果影响大吗?
实验设计: 固定网络,改变 test_ratio 观察结果稳定性。
def sensitivity_analysis(G, test_ratios=[0.1, 0.2, 0.3, 0.4]): |
Q3: 如何处理有向图?
转换方法: 1. 忽略方向,当无向图处理 2. 使用有向版本的指标(考虑入度/出度) 3. 分别预测入边和出边
def adamic_adar_directed(G, u, v): |
评分要点
| 评分项 | 权重 | 检查点 |
|---|---|---|
| 算法实现 | 30% | CN, JC, AA, RA, PA 正确实现 |
| 实验设计 | 25% | 合理的 train/test 划分,足够样本量 |
| 结果分析 | 25% | AUC/PR 曲线,统计显著性 |
| 报告质量 | 20% | 图表清晰,解释充分,讨论深入 |
加分项: - 实现 Katz、PageRank 等全局指标 - 分析不同 test_ratio 的敏感性 - 处理有向图或加权图 - 使用集成学习提升预测效果
参考资源
- Liben-Nowell & Kleinberg (2007): "The Link Prediction Problem for Social Networks"
- Zhou et al. (2009): "Predicting missing links via local information"
- NetworkX Link Prediction:
nx.link_prediction模块
Last Updated: 2026-04-19
Status: ✅ Complete