矩阵分解
1.SVD 算法
1.1 矩阵分解
矩阵分解就是把原来的大矩阵,近似分解成两个小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。
比如用户物品评分矩阵是
m
×
n
m\times n
m×n,可以选取一个很小的数,分解得到两个矩阵
P
P
P和
Q
Q
Q,
P
P
P的维度是
m
×
k
m\times k
m×k,
Q
Q
Q的维度是
n
×
k
n\times k
n×k,那这样:
KaTeX parse error: Expected 'EOF', got '}' at position 30: …Q_{n\times k}^T}̲ = R_{m\times …
1.2 基础SVD算法
从物理层面解释,矩阵分解是把用户和物品都映射到一个K维空间上,这个k维空间不是我们直接看到的,也不一定具有很好的解释型,每一个维度也没有名字,所以常被称为隐因子,代表藏在矩阵数据下面的规律。分解后矩阵 P P P的行向量就是用户的隐因子向量, Q T Q^T QT的列向量就是物品的隐因子向量。
用户
u
u
u的向量是
P
u
P_u
Pu,物品
i
i
i的向量是
q
i
q_i
qi,那么要计算物品
i
i
i推荐给用户
u
u
u的推荐分数,直接计算点积即可:
r
u
i
=
p
u
q
i
T
r_{ui}=p_uq_i^T
rui=puqiT
这个难点在于如何得到每一个用户、每一个物品的
k
k
k维向量。这是一个机器学习问题。应用机器学习框架时,一般要考虑:
- 损失函数
- 优化算法
SVD算法的损失函数:
J
=
m
i
n
∑
(
u
,
i
)
∈
k
(
r
u
i
−
p
u
q
i
T
)
2
+
λ
(
∣
∣
q
i
∣
∣
2
+
∣
∣
p
u
∣
∣
2
)
J=min\sum_{(u,i)\in k}(r_{ui}-p_uq_i^T)^2+\lambda(||q_i||^2+||p_u||^2)
J=min(u,i)∈k∑(rui−puqiT)2+λ(∣∣qi∣∣2+∣∣pu∣∣2)
加号前面部分控制着模型的偏差,加号后的部分控制着模型的方差。前一部分用分解后的矩阵预测评分,预测结果和实际的用户评分之间误差越小越好。后面一部分得到的隐因子向量要越简单越好,以此控制模型的方差,即让它在真正执行推荐任务时要发挥稳定,对应ML中的过拟合。
然后使用梯度下降法类似的优化算法,通过不断迭代得到使损失函数最小的参数值。
整个SVD算法的学习过程如下:
- 1.准备好用户物品的评分矩阵 R R R,将每一条评分数据看做一条训练样本;
- 2.给分解后的 P P P矩阵和 Q Q Q矩阵随机初始化元素值;
- 3.用 P P P矩阵和 Q Q Q矩阵计算预测后的评分;
- 4.计算预测的评分和实际的评分误差;
- 5.按照上述参数更新公式更新 P P P矩阵和 Q Q Q矩阵中的元素值;
- 6.重复步骤3~5,直到达到停止条件,比如超过设定迭代次数或者 P P P矩阵和 Q Q Q矩阵中的元素值收敛。
1.3 增加偏置信息
防止标准宽松或严格用户打分偏差,在SVD基础上加上偏置信息。一个用户给一个物品评分由四部分组成,具体如下:
r
u
i
=
u
+
b
i
+
b
u
+
p
u
q
i
T
r_{ui} = u+b_i+b_u+p_uq_i^T
rui=u+bi+bu+puqiT
从左到右依次为:全局平均分、物品的评分偏置、用户的评分偏置、用户和物品之间的兴趣偏好。
1.4 增加历史行为
SVD算法结合用户的隐式反馈行为和属性,这套模型叫作SVD++算法。
1.4 考虑时间因素
在SVD算法中考虑时间因素,有几种做法:
- 对评分按照时间加权,让时间比较久远的评分更趋近平均值;
- 对评分时间划分区间,在不同的时间区间内分别学习出隐因子向量,再按照不同的区间使用对应的隐因子来计算;
- 对特殊的区间,如节日、周末等训练对应的隐因子向量。
2.ALS 算法
ALS算法就是交替最小二乘法,这是Facebook在推荐系统中使用的主要矩阵分解方法。