SilverIce Toolbox
Back to course

Stage 6 / Chapter 24

第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 完整实现

代码案例

python
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

  1. 正则化实验:对比 λ=0, 0.01, 0.1, 1.0 时的过拟合程度。
  1. 隐因子解释:分析学得的隐因子是否有可解释性。
  1. NCF 实现:用 PyTorch 实现 Neural Collaborative Filtering。
  1. 序列推荐:了解用 RNN/Transformer 建模用户行为序列的推荐方法。
  1. 评估指标对比:在同一数据集上计算 Precision@K、Recall@K、NDCG,分析它们的差异。
  1. 冷启动模拟:构造一个新用户,对比协同过滤和基于内容的推荐效果。
  1. 负采样:在隐式反馈(点击/浏览)场景下,如何采样负样本?