推荐中的矩阵分解

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(ruipuqiT)2+λ(qi2+pu2)
加号前面部分控制着模型的偏差,加号后的部分控制着模型的方差。前一部分用分解后的矩阵预测评分,预测结果和实际的用户评分之间误差越小越好。后面一部分得到的隐因子向量要越简单越好,以此控制模型的方差,即让它在真正执行推荐任务时要发挥稳定,对应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在推荐系统中使用的主要矩阵分解方法。

2.1 ALS 算法原理

2.2 隐式反馈

2.3 推荐计算

3.BPR算法

猜你喜欢

转载自blog.csdn.net/weixin_44127327/article/details/110089441