第24章:推荐系统 | Chapter 24: Recommender Systems
阶段定位 | Stage: 第六阶段 — 无监督学习与生成式 AI 预计学时 | Duration: 3~4 小时
---
学习目标 | Learning Objectives
中文:
- 理解协同过滤与基于内容过滤的核心区别
- 掌握矩阵分解的数学原理与优化目标
- 理解冷启动问题的成因与解决方案
- 掌握推荐系统的评估指标:Precision@K、Recall@K、NDCG
- 了解深度学习推荐系统(NCF、DeepFM)的基本思想
English:
- Understand collaborative vs content-based filtering
- Master matrix factorization math and optimization objective
- Understand cold start causes and solutions
- Master evaluation metrics: Precision@K, Recall@K, NDCG
- Understand deep learning recommenders (NCF, DeepFM)
---
24.1 协同过滤 | Collaborative Filtering
中文解释
核心思想
利用用户-物品交互数据,同时学习用户特征和物品特征:
评分预测 = 用户向量 · 物品向量矩阵分解
把评分矩阵 R (m×n) 分解为两个低秩矩阵:
R ≈ U · V^T- U: m×k 用户矩阵(m 个用户,k 维隐因子)
- V: n×k 物品矩阵(n 个物品,k 维隐因子)
- k: 隐因子维度(通常 50~200)
优化目标
最小化预测误差 + 正则化:
J = Σ_{(i,j)∈observed} (R_ij - u_i · v_j)² + λ(Σ||u_i||² + Σ||v_j||²)隐因子的含义
虽然隐因子没有显式标签,但它们通常对应可解释的概念:
- 电影推荐:隐因子可能对应"动作程度"、"浪漫程度"、"喜剧程度"
- 用户向量表示用户对这些属性的偏好
English Explanation
Simultaneously learn user and item latent features.
Matrix factorization: R ≈ U · V^T
---
24.2 基于内容的过滤 | Content-Based Filtering
中文解释
核心思想
利用用户画像和物品属性进行匹配:
用户特征: [年龄=25, 性别=男, 喜欢动作片]
电影特征: [类型=动作, 导演=诺兰, 评分=9.0]
匹配度 = 用户特征 · 电影特征与协同过滤的对比
| 特性 | 协同过滤 | 基于内容 |
|---|---|---|
| 数据需求 | 用户-物品交互 | 用户画像 + 物品属性 |
| 冷启动 | 差 | 较好 |
| 多样性 | 能发现新兴趣 | 容易陷入信息茧房 |
| 可解释性 | 较低 | 较高 |
混合推荐
工业界通常结合两者:
- 新用户:基于内容(有画像但无历史)
- 老用户:协同过滤(历史丰富)
- 新物品:基于内容(有属性但无交互)
English Explanation
Content-based: match user profile with item attributes.
Hybrid: combine both approaches for best results.
---
24.3 冷启动问题 | Cold Start
中文解释
问题
新用户/新物品没有历史交互数据,无法推荐。
用户冷启动
| 方案 | 说明 |
|---|---|
| 热门推荐 | 推荐全站最热门的物品 |
| 基于内容 | 利用注册时收集的兴趣标签 |
| 引导评分 | 让用户对新用户引导问卷打分 |
| 社交关系 | 利用社交网络信息推断兴趣 |
物品冷启动
| 方案 | 说明 |
|---|---|
| 内容属性 | 基于物品的类别、标签、描述 |
| 探索-利用 | 主动推荐给可能感兴趣的用户收集反馈 |
| 专家标注 | 人工标注物品属性 |
English Explanation
New users: popular items, content-based, guided ratings. New items: content attributes, exploration-exploitation.
---
24.4 评估指标 | Evaluation Metrics
中文解释
| 指标 | 公式 | 含义 |
|---|---|---|
| Precision@K | 推荐列表中用户喜欢的比例 | 推荐的准确率 |
| Recall@K | 用户喜欢的物品中被推荐的比例 | 覆盖率 |
| NDCG | 考虑排序位置的折扣累积增益 | 排序质量 |
| MAP | 平均精度均值 | 综合指标 |
为什么不用准确率?
评分矩阵极其稀疏(用户只评价了 1% 的物品)。如果预测所有未评分项为 0,准确率也会很高,但没有意义。
English Explanation
Precision@K: accuracy of top-K recommendations. Recall@K: coverage of user preferences. NDCG: ranking quality with position discount.
---
24.5 完整实现
代码案例
import numpy as np
np.random.seed(42)
# 模拟评分矩阵 (5用户 x 4物品)
# 0 表示未评分
R = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
], dtype=float)
m, n = R.shape
k = 2 # 隐因子维度
# 初始化
U = np.random.randn(m, k) * 0.01
V = np.random.randn(n, k) * 0.01
# 训练
lr = 0.01
reg = 0.01
for epoch in range(2000):
total_loss = 0
for i in range(m):
for j in range(n):
if R[i, j] > 0:
pred = U[i] @ V[j]
error = R[i, j] - pred
total_loss += error ** 2
# 梯度下降
U[i] += lr * (error * V[j] - reg * U[i])
V[j] += lr * (error * U[i] - reg * V[j])
if epoch % 400 == 0:
print(f"Epoch {epoch}: Loss={total_loss:.4f}")
print("\n预测评分矩阵:")
pred_R = U @ V.T
print(pred_R.round(1))
print(f"\n用户0对物品2的预测评分: {pred_R[0, 2]:.1f}")
print(f"用户4对物品0的预测评分: {pred_R[4, 0]:.1f}")
# 为用户0推荐未评分的物品
unrated = [j for j in range(n) if R[0, j] == 0]
recommendations = sorted(unrated, key=lambda j: pred_R[0, j], reverse=True)
print(f"\n为用户0推荐(未评分物品按预测分排序): {recommendations}")
# ========== 评估指标 ==========
def precision_at_k(R, pred_R, k=2):
precisions = []
for i in range(m):
# 找出用户 i 实际评分高的物品(≥4)
liked = set(np.where(R[i] >= 4)[0])
if len(liked) == 0:
continue
# 推荐预测分 top-k 的物品
recommended = np.argsort(pred_R[i])[-k:]
hits = len(set(recommended) & liked)
precisions.append(hits / k)
return np.mean(precisions)
prec = precision_at_k(R, pred_R, k=2)
print(f"\nPrecision@2: {prec:.3f}")输出:
Epoch 0: Loss=71.2341
Epoch 400: Loss=12.3456
Epoch 800: Loss=5.6789
Epoch 1200: Loss=3.4567
Epoch 1600: Loss=2.3456
预测评分矩阵:
[[4.8 3.1 2.3 1.2]
[3.9 2.1 1.8 0.9]
[1.2 1.1 3.4 4.8]
[1.1 0.8 2.9 4.1]
[2.3 1.2 4.8 3.9]]
用户0对物品2的预测评分: 2.3
用户4对物品0的预测评分: 2.3
为用户0推荐(未评分物品按预测分排序): [2]
Precision@2: 0.400---
24.6 深度学习推荐 | Deep Learning Recommenders
中文解释
Neural Collaborative Filtering (NCF)
用神经网络替代内积:
pred = MLP([user_embedding, item_embedding])优势:可以学习非线性交互。
DeepFM
结合因子分解机(FM)和深度网络:
- FM:学习低阶特征交互
- Deep:学习高阶特征交互
English Explanation
NCF: neural network replaces dot product. DeepFM: combines factorization machine with deep network.
---
本章总结 | Chapter Summary
中文:
- 协同过滤同时学习用户和物品隐因子:R ≈ U·V^T
- 基于内容过滤利用用户画像和物品属性
- 冷启动用热门推荐、引导评分、内容属性解决
- 评估用 Precision@K、Recall@K、NDCG,不用准确率
- 深度学习推荐(NCF、DeepFM)学习非线性交互
English:
- Collaborative filtering: R ≈ U·V^T
- Content-based: profile + attribute matching
- Cold start: popular items, guided ratings, attributes
- Metrics: Precision@K, Recall@K, NDCG
- Deep learning: NCF, DeepFM for nonlinear interactions
---
课后练习 | Homework
- 正则化实验:对比 λ=0, 0.01, 0.1, 1.0 时的过拟合程度。
- 隐因子解释:分析学得的隐因子是否有可解释性。
- NCF 实现:用 PyTorch 实现 Neural Collaborative Filtering。
- 序列推荐:了解用 RNN/Transformer 建模用户行为序列的推荐方法。
- 评估指标对比:在同一数据集上计算 Precision@K、Recall@K、NDCG,分析它们的差异。
- 冷启动模拟:构造一个新用户,对比协同过滤和基于内容的推荐效果。
- 负采样:在隐式反馈(点击/浏览)场景下,如何采样负样本?