矩阵分解-梯度下降

一,矩阵分解能够解决的推荐问题

假如你得到了用户对商品的打分数据,数据形式如下:

Item1I2I3I4
User153-1
U24--1
U311-5
U41--4
U5-154

其中,U1⋯U5U1⋯U5表示的是5个不同的用户,I1,I2⋯I4表示的是4个不同的商品,这样便构成了户-商品矩阵,在该矩阵中,有用户对每一件商品的打分,其中“-”表示的是用户未对该商品进行打分。我们可以利用矩阵分解来计算未评分的商品,然后对他们进行排序,把评分靠前的推荐给用户。是不是很神奇?下面就让我们开始学习吧!

二,矩阵分解

1,矩阵分解的优势

矩阵的分解,其实有三种方法。1.特征值分解(Eigendecomposition)2.奇异值分解SVD(Singular Value Decomposition)3.Funk - SVD (Simon Funk SVD),对症下药,适合自己的才是最好的,这里应用的是第三种,推荐系统中起先应用最早的是协同过滤算法,后来者居上的原因当然是矩阵分解能解决对稀疏数据的处理问题,比如基于用户的协同过滤就是尽可能的找到和你相似的用户,将他们喜欢的电影推荐给你。这里面的问题就是,如果一个电影虽然很符合你的兴趣,但是你的朋友却很少有评价或观看过,那么协同过滤就很难将这个电影推荐给你,因为没有评价就不确定这个电影与你看过的电影是否有很近的相似度。那么矩阵分解的出现,很好的解决了协同过滤存在的问题。

2,矩阵分解的思想

矩阵分解(Funk-SVD)是将一个矩阵,比如为m × \times ×n的R矩阵,就可以分解为 P m k P_{mk} Pmk × \times × Q k n Q_{kn} Qkn。这里的k的大小决定了 R ^ \hat{R} R^(预测矩阵)的准确度,其取值要经过多次的实验来确定。

3,基于矩阵分解的推荐算法步骤

注意:下面的带^的表示预测值,小写字母代表具体的值。

3.1一般形式

对于上述的用户-商品矩阵(评分矩阵),记为 R m n R_{mn} Rmn,可以将其分解成两个或者多个矩阵的乘积,假设分解成两个矩阵 P m k P_{mk} Pmk × \times × Q k n Q_{kn} Qkn,我们要使得矩阵 P m k P_{mk} Pmk Q k n Q_{kn} Qkn的乘积能够近似的还原原始的矩阵 R m n R_{mn} Rmn R m n ≈ P m k × Q k n = R ^ m n R_{mn}\approx P_{mk}\times Q_{kn}=\hat{R}_{mn} RmnPmk×Qkn=R^mn

3.2 套路求Loss函数

3.21 构造损失函数

损失函数往往是拿预测值与真实值进行做差来得到的,这也是损失的精髓,加上平方的作用则是防止负值与正值得抵消。这里不妨构造 e i j 2 = ( r i j − r ^ i j ) 2 = ( r i j − ∑ k = 1 k p i k q k j ) 2 e_{ij}^{2}=(r_{ij}-\hat r_{ij})^{2}=(r_{ij}-\sum_{k=1}^{k}p_{ik}q_{kj})^{2} eij2=(rijr^ij)2=(rijk=1kpikqkj)2
然后通过给定的阈值来限定loss函数的结束或迭代次数。

3.22 loss函数的求解

对于上面loss函数的求解,我们会采用梯度下降算法.
(1)求损失函数的梯度: δ e i j 2 δ p i k = − 2 e i j q k j \frac{\delta e_{ij}^2}{\delta p_{ik}}=-2e_{ij}q_{kj} δpikδeij2=2eijqkj
δ e i j 2 δ q k j = − 2 e i j p i k \frac{\delta e_{ij}^2}{\delta q_{kj}}=-2e_{ij}p_{ik} δqkjδeij2=2eijpik
或许有人会纳闷 ∑ \sum 符号为什么会随着求偏导的过程而消失,下面给出的手工推导会给你答案:在这里插入图片描述
(2)根据负梯度的方向来更新参数变量:
p i k ′ = p i k − α δ e i j 2 δ p i k = p i k + 2 α e i j q k j p_{ik'}=p_{ik}-\alpha \frac{\delta e_{ij}^{2}}{\delta p_{ik}}=p_{ik}+2\alpha e_{ij}q_{kj} pik=pikαδpikδeij2=pik+2αeijqkj
q k j ′ = q k j − α δ e i j 2 δ q k j = q k j + 2 α e i j p i k q_{kj'}=q_{kj}-\alpha \frac{\delta e_{ij}^{2}}{\delta q_{kj}}=q_{kj}+2\alpha e_{ij}p_{ik} qkj=qkjαδqkjδeij2=qkj+2αeijpik
(3)不停的迭代计算直到算法最终收敛(即预测值与真实值小于设定的阈值)
(4)很多时候会涉及正则化项的步骤,对loss函数进行正则化是为了解决函数过拟合(就是得到的结果与训练集的拟合程度近乎完美而对测试集数据不适用)的问题。有关正则化的问题这里暂不进行详细解说。

4,实例说明

4.1 例子

就拿上面的例子吧。

4.2 代码实现

from math import pow
import numpy
#定义求修正的p跟q矩阵函数
def matrix_factorzation(R,P,Q,K,N=5000,step=0.0002,beta=0.02):
    #N是迭代次数,step为步长,beat为正则化参数
    Q=Q.T# .T操作表示矩阵的转置
    for n in range(N):
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:#对原始矩阵中有评分的项构造损失函数
                    eij=R[i][j]-numpy.dot(P[i,:],Q[:,j])#.dot(P,Q) 表示矩阵乘法
                    for k in range(K):
                        P[i][k]=P[i][k]+step*(2*eij*Q[k][j]-beta*P[i][k])
                        Q[k][j]=Q[k][j]+step*(2*eij*P[i][k]-beta*Q[k][j])
        e=0
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:
                    e=e+pow(R[i][j]-numpy.dot(P[i,:],Q[:,j]),2)
                    for k in range(K):
                        e=e+(beta/2)*(pow(P[i][k],2)+pow(Q[k][j],2))
        if e<0.001:#阈值
            break
    return P,Q.T
    
R=[[5,3,0,1],
   [4,0,0,1],
   [1,1,0,5],
   [1,0,0,4],
   [0,1,5,4]
          ]
R=numpy.array(R)#生成矩阵R
K=10
P=numpy.random.rand(len(R),K)#随机生成P,Q矩阵
Q=numpy.random.rand(len(R[0]),K)

P,Q=matrix_factorzation(R,P,Q,K)
print("原始的评分矩阵R为:\n",R)
R_MF=numpy.dot(P,Q.T)#再做一次修正后P,Q矩阵乘法
print("经过MF算法评分后的矩阵是:\n",R_MF)

结果:在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ML-100k矩阵分解是一种用于推荐系统的算法。推荐系统的目标是根据用户的历史行为和偏好,向用户推荐可能感兴趣的物品。而使用矩阵分解算法可以从用户和物品的历史交互数据中学习出一个矩阵的低维表示,以此来预测用户对未来物品的喜好程度。 在ML-100k数据集中,矩阵分解算法将用户-物品交互数据表示为一个稀疏的用户-物品矩阵,其中行对应于用户,列对应于物品,矩阵中的每个元素表示用户对物品的评分或偏好。而矩阵分解的目标就是将这个稀疏矩阵分解为两个低维的稠密矩阵,分别表示用户和物品的隐含特征。 具体来说,矩阵分解算法使用梯度下降等优化方法,通过最小化原始矩阵和分解矩阵的重建误差来学习用户和物品的隐含特征。学习到的用户和物品的隐含特征可以用来计算用户对未选择物品的预测评分。通过这些预测评分,可以向用户推荐可能感兴趣的物品。 ML-100k矩阵分解是一种经典的推荐算法,已被广泛应用于推荐系统中。它的优点包括算法简单、易于实现和理解,同时也具有较好的预测准确性和推荐效果。然而,矩阵分解算法也存在一些局限性,例如对于新用户和新物品的冷启动问题需要采用其他推荐方法。为了进一步提升推荐系统的性能,可以结合其他技术和策略,如内容过滤、协同过滤、深度学习等方法,进行综合应用和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值