← 返回 Day 122 正文

Day 122 · 练习与清单

Day 122 — 推荐系统基础 — 练习清单

✅ 今日完成清单


📝 基础练习题

练习 1:手动计算相似度

给定以下用户评分向量(0表示未评分):

用户A: [5, 3, 4, 0, 1]
用户B: [3, 1, 2, 3, 0]

问题: 1. 计算用户A和用户B的余弦相似度(只考虑两者都评分的物品) 2. 计算用户A和用户B的皮尔逊相关系数 3. 哪种相似度更适合推荐系统?为什么?


练习 2:预测评分

使用以下评分矩阵:

          电影1  电影2  电影3  电影4
用户1       5      3      4      ?
用户2       3      1      2      3
用户3       4      3      4      3
用户4       1      5      5      2

问题: 1. 用 User-Based CF (k=2) 预测用户1对电影4的评分 2. 用 Item-Based CF (k=2) 预测用户1对电影4的评分 3. 对比两种方法的预测结果


练习 3:矩阵分解

给定以下评分矩阵:

R = [[5, 3, 0, 1],
     [4, 0, 0, 1],
     [1, 1, 0, 5],
     [1, 0, 0, 4],
     [0, 1, 5, 4]]

问题: 1. 这个矩阵的稀疏度是多少? 2. 如果用 k=2 的矩阵分解,P矩阵和Q矩阵的形状分别是什么? 3. 用截断SVD分解这个矩阵,写出近似的 R ≈ P × Qᵀ


🔥 进阶挑战题

挑战 1:实现改进的协同过滤

修改 01-collaborative-filtering-basics.py,添加以下功能:

  1. 时间衰减:最近的评分权重更高
  2. 惩罚热门物品:减少热门物品对相似度计算的影响 (IUF)
  3. 默认评分:对完全冷启动用户使用全局平均分
python
# 提示: 时间衰减公式
weight = 1 / (1 + alpha * days_since_rating)

挑战 2:评估指标实现

不使用任何第三方库,从零实现以下评估指标:

  1. Precision@K
  2. Recall@K
  3. NDCG@K (Normalized Discounted Cumulative Gain)
  4. MAP (Mean Average Precision)

测试数据:

推荐列表: ["A", "B", "C", "D", "E"]
相关物品: {"B", "D", "F"}
K = 3

挑战 3:ALS 矩阵分解

在 02-matrix-factorization-svd.py 的基础上:

  1. 实现带 置信度权重 的 ALS (参考 Netflix Prize 论文)
  2. 添加 早停机制:当 RMSE 变化小于阈值时停止训练
  3. 对比不同隐因子数 k 对 RMSE 的影响
python
# 置信度权重公式 (Netflix Prize)
c_ui = 1 + alpha * r_ui  # 置信度
p_ui = 1 if r_ui > 0 else 0  # 偏好

挑战 4:构建电影推荐系统

扩展 03-movie-recommender.py,实现:

  1. 混合推荐:结合 User-Based CF + Item-Based CF + 基于内容推荐
  2. 推荐解释:为每个推荐生成解释(为什么推荐这部电影)
  3. A/B测试模拟:随机将用户分组,对比不同算法的效果

📚 扩展阅读