矩阵分解的推荐算法

1.基于矩阵分解的推荐算法相关理论介绍

我们知道,要做推荐系统,最基本的一个数据就是,用户-物品的评分矩阵,如下图

  • 式一

在这里插入图片描述
矩阵中,描述了5个用户(U1,U2,U3,U4 ,U5)对4个物品(D1,D2,D3,D4)的评分(1-5分)

1.1明确算法目的

  • 图中“-”表示“未评分”
    未评分即说明该位用户Ui未购买改件商品,因此我们的目的就是把没评分的预测出一个评分,再根据预测评分的高低给用户进行推荐

所以,我们应该如何进行预测?

2.矩阵分解预测评分步骤及公式

2.1步骤

本节的方法是运用矩阵分解来预测。假设,R是类似上图的评分矩阵,N * M维(N表示行数,M表示列数,如上图N=5,M=4),矩阵R分解 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵,其中 P ^ \hat{P} P^矩阵维度N * K, Q ^ \hat{Q} Q^矩阵维度K * M。再让 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵做矩阵乘法来得到预测矩阵 R ^ \hat{R} R^

我们想预测式一的未知评分就需要预测一个预测矩阵,在预测矩阵中我们可以看到未评分的商品都有了预测评分,因此预测目的就达到了。

现在我们可能会有问题,原矩阵R不完整,如何能分解出 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵呢?
P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵其实我们虚拟出来的,我们无法令R直接分解得出。所以我们接着说如何虚拟 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵。
在Python库中,有一个numpy库可任意生成自定义大小的矩阵,我们可利用库生成 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个虚拟矩阵,初始值都设为0。我们知道,两个值都为0的矩阵做乘法肯定得到的预测矩阵 R ^ \hat{R} R^没有意义,因此我们要对 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵进行修正,直到将 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵修正到满足一定条件后再进行矩阵乘法得出预测矩阵 R ^ \hat{R} R^,此时的预测矩阵就可以拟合出未评分项。
那么我们如何修正 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵呢?
我们需要用到梯度下降算法,推荐大家没学习梯度下降的可以先看博客2部分梯度下降的讲解。
我们如何判断修正后的 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵拟合程度较好呢?
首先我们需要设定损失函数loss函数

2.1.1损失函数(loss函数)

损失函数:使用原始的评分矩阵与重新构建的评分矩阵之间的误差的平方作为损失函数,因此构造损失函数我们只能选择原始矩阵R中已评分项来构造。即: 如果R(i,j)已知,则R(i,j)的误差平方和为:

在这里插入图片描述
最终,需要求解所有的非“-”项(就是说原有矩阵里未评分项)的损失之和的最小值:
在这里插入图片描述
当损失函数最小时候,我们修正的 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵就可作为原矩阵的分解矩阵啦,再进行矩阵乘法得出预测矩阵 R ^ \hat{R} R^就拟合的很好了,我们的目的也就完成了
为什么求损失函数最小值
当损失函数最小的时候我们的 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵修正的就ok了,可以看做为原矩阵分解的矩阵。不理解损失函数我们继续往下看

2.2公式数学解释

  • 式二


对于P,Q矩阵的解释,直观上,P矩阵是N个用户对K个主题的关系,Q矩阵是K个主题跟M个物品的关系,至于K个主题具体是什么,在算法里面K是一个参数,需要调节的,通常10~100之间

  • 式三
    在这里插入图片描述
    式三公式左侧项表示预测矩阵 R ^ \hat{R} R^ 第i行,第j列的元素值,对于如何衡量,我们分解的好坏呢,式子四,给出了衡量标准,也就是损失函数(loss函数),平方项损失,最后的目标,就是每一个元素(非缺失值)的e(i,j)的总和最小
    损失函数:使用原始的评分矩阵与重新构建的评分矩阵之间的误差的平方作为损失函数,即: 如果R(i,j)已知,则R(i,j)的误差平方和为:
  • 式四

在这里插入图片描述
最终,需要求解所有的非“-”项(就是说原有矩阵里未评分项)的损失之和的最小值:

在这里插入图片描述
最小值如何来求?我们在矩阵分解算法里用到了梯度下降法来解决求损失函数和最小值的方法。

上面内容讲解了大致步骤,我们下面来深究问题
如何利用梯度下降来求得损失函数最小值

3.梯度下降算法

梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值
结合上面内容我们构造出损失函数之后为求损失之和最小值。可以利用梯度下降算法
下面是我写的关于梯度下降算法的博客,大家可以参考
梯度下降基本算法

4.利用梯度下降法获得满足损失函数阈值的修正的p和q分量

结合梯度下降算法我们来进行

  • 求解损失函数负梯度

在这里插入图片描述
我们学习了梯度下降后可以知道负梯度就是负导数值,上式就是在求偏导,因为我们要修正 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵,所以偏导

  • 根据负梯度的方向更新变量
    在这里插入图片描述
  • 不停迭代直到算法最终收敛(直到sum(e^2) <=阈值 ε \varepsilon ε
  • 阈值 ε \varepsilon ε:由于损失函数求和的最小值或许很小,我们迭代N次时候,损失函数和已经足够小时,我们其实就可以停止迭代。因此我们可以一开始就设定有限次循环来做这个计算,或者规定一个阈值 ε \varepsilon ε(令其足够小例如0.001),当我们迭代到sum(e^2) <=阈值时,结束循环,我们就可以得到我们想要的 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个矩阵。

4.1增加正则化项(为了防止过拟合)

什么是过拟合,我们在通过矩阵分解法得出预测矩阵 R ^ \hat{R} R^后,会存在一些较大的偏差,是的我们预测值不准,为了解决这个问题我们加入正则化

  • 通常在求解的过程中,为了能够有较好的泛化能力,会在损失函数中加入正则项,以对参数进行约束
  • 使用梯度下降法获得修正的p和q分量:
    在这里插入图片描述

-根据负梯度的方向更新变量:
在这里插入图片描述

我们可以通过对比加入正则化项后的公式与原公式进行理解

5.预测矩阵获得以及推荐

经过上矩阵分解算法求得修正的 P ^ \hat{P} P^ Q ^ \hat{Q} Q^矩阵后,我们进行矩阵乘法得到我们的预测矩阵 R ^ \hat{R} R^

5.1矩阵乘法

干说不易理解,看个视频吧 https://www.bilibili.com/video/BV1K54y1d7VD?t=47

5.2最终推荐

根据预测矩阵对用户U为购买的商品I预测的评分高低来筛选出为用户U推荐的商品I

6.代码实现(python)

代码写的水勿喷 ,大神请指教
代码例子就是本文式一所举出的例子

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)

  • 运行结果

在这里插入图片描述
根据预测矩阵评分进行推荐

7.总结

  1. 我们的目的就是求用户对某些未购买物品的预测评分
  2. 通过矩阵分解算法进行求解预测函数 R ^ \hat{R} R^
  3. 最重要的点就是利用梯度下降算法修正 P ^ \hat{P} P^ Q ^ \hat{Q} Q^两个分解矩阵

编写不易,谢谢阅读,如有错误还请帮我指出谢谢
觉得值得鼓励就点个赞

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值