Day 122 — 推荐系统基础 — 练习清单
✅ 今日完成清单
- [ ] 理解推荐系统的基本概念和分类
- [ ] 掌握基于内容的推荐原理
- [ ] 掌握 User-Based 协同过滤算法
- [ ] 掌握 Item-Based 协同过滤算法
- [ ] 理解矩阵分解 (SVD/ALS) 原理
- [ ] 了解冷启动问题及其解决方案
- [ ] 了解推荐系统评估指标
- [ ] 完成 3 个代码示例的运行和理解
- [ ] 完成以下练习题
📝 基础练习题
练习 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,添加以下功能:
- 时间衰减:最近的评分权重更高
- 惩罚热门物品:减少热门物品对相似度计算的影响 (IUF)
- 默认评分:对完全冷启动用户使用全局平均分
python
# 提示: 时间衰减公式
weight = 1 / (1 + alpha * days_since_rating)
挑战 2:评估指标实现
不使用任何第三方库,从零实现以下评估指标:
- Precision@K
- Recall@K
- NDCG@K (Normalized Discounted Cumulative Gain)
- MAP (Mean Average Precision)
测试数据:
推荐列表: ["A", "B", "C", "D", "E"]
相关物品: {"B", "D", "F"}
K = 3
挑战 3:ALS 矩阵分解
在 02-matrix-factorization-svd.py 的基础上:
- 实现带 置信度权重 的 ALS (参考 Netflix Prize 论文)
- 添加 早停机制:当 RMSE 变化小于阈值时停止训练
- 对比不同隐因子数 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,实现:
- 混合推荐:结合 User-Based CF + Item-Based CF + 基于内容推荐
- 推荐解释:为每个推荐生成解释(为什么推荐这部电影)
- A/B测试模拟:随机将用户分组,对比不同算法的效果
📚 扩展阅读
- 阅读 Surprise 库文档,用它重新实现上述练习
- 了解 LightFM 混合推荐库
- 研究 RecBole 推荐系统框架
- 阅读 Netflix Prize 竞赛的相关论文