矩阵分解通过将用户-电影评分矩阵分解为用户特征矩阵和电影特征矩阵的乘积,从而可以预测评分,是一种更高级的推荐算法。常用的矩阵分解方法是 奇异值分解(SVD) 或 非负矩阵分解(NMF)。而在实际的应用场景中,会出现大规模的稀疏矩阵,使用SVD等常用分解法并不高效(SVD会处理矩阵中大量的空值或未评分项)。
1、核心思想
假设我们有用户-电影评分矩阵 $R$,我们希望将其分解为两个矩阵:
$$ R \approx P \cdot Q^T $$
其中,$P$ 是用户特征矩阵,Q 是电影特征矩阵。$ P[i] $ 表示用户 $ i $ 的隐含特征向量,$Q[j]$ 表示电影 $j$ 的隐含特征向量。预测用户 $ i $ 对电影 $j $ 的评分则为:
$$ R[i][j] = P[i] \cdot Q[j]^T $$
2、实现步骤
2.1 初始化
随机初始化用户矩阵 $P$ 和电影矩阵 $Q$。假设特征向量的维度为 $k$(通常取 10-100)。如果我们有 $n$ 个用户和 $m$ 部电影,那么 $P$ 是 $n \times k$ 的矩阵,$Q$ 是 $m \times k$ 的矩阵。
2.2 优化目标
我们的目标是最小化用户实际评分 $R[i][j]$ 与预测评分 $P[i] \cdot Q[j]^T$ 之间的差距:
$$ \min \sum_{(i,j) \in R} \left( R[i][j] – P[i] \cdot Q[j]^T \right)^2 + \lambda \left( |P[i]|^2 + |Q[j]|^2 \right) $$
其中,$ λ $ 是正则化参数,防止过拟合。
2.3 梯度下降
使用 随机梯度下降(SGD) 进行优化,更新$ P $ 和 $ Q $ 的值。对于每个已知的评分 $ R[i][j] $,我们对$ P[i] $ 和 $ Q[j] $ 执行如下更新:
$$ P[i] := P[i] + \alpha \cdot \left( 2 \cdot (R[i][j] – P[i] \cdot Q[j]^T) \cdot Q[j] – 2 \cdot \lambda \cdot P[i] \right) $$
$$ Q[j] := Q[j] + \alpha \cdot \left( 2 \cdot (R[i][j] – P[i] \cdot Q[j]^T) \cdot P[i] – 2 \cdot \lambda \cdot Q[j] \right) $$
其中,α 是学习率。
2.4 预测评分:
一旦训练完成,预测用户 i 对电影 j 的评分为:
$$ \hat{R}[i][j] = P[i] \cdot Q[j]^T $$
根据这些预测评分,向用户推荐评分最高的电影。
3、 优缺点
优点:能够处理稀疏矩阵,发现隐含的用户和电影特征,推荐精确度高。
缺点:相比协同过滤,训练时间较长;矩阵分解模型可能需要较大规模的数据集才能发挥出效果。