矩阵分解算法

这篇具有很好参考价值的文章主要介绍了矩阵分解算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一·、定义(什么是矩阵分解)

二、矩阵分解的原理

三、矩阵分解的方法

四、矩阵分解的步骤

五、代码实现

六、矩阵分解的优缺点

一·、定义(什么是矩阵分解)

矩阵分解就是预测出评分矩阵中的缺失值,然后根据预测值以某种方式向用户推荐。常见的矩阵分解方法有基本矩阵分解(basic MF),正则化矩阵分解)(Regularized MF),基于概率的矩阵分解(PMF)等。矩阵分解,直观上来说就是把原来的大矩阵,近似分解成两个小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。

二、矩阵分解的原理

矩阵分解算法

首先来概括的说下矩阵分解的原理。 上图中每一行u uu代表每个用户,每一列s ss代表每个物品,矩阵中的数字代表着用户对物品的打分。?代表着用户没有给这个物品打过分。在实际数据中,我们通过数据构建的矩阵如上图一样并不是一个全部有评分的矩阵。在Netflix真实的数据集里,矩阵的稠密度仅有3%左右。那么就意味着,矩阵中有绝大部分的评分是空白的。如何得到这些空白的评分呢?矩阵分解的就是为了解决这个问题。

矩阵分解算法将m × n m\times nm×n维的矩阵R RR分解为m × k m\times km×k的用户矩阵U UU和k × n k\times nk×n维的物品矩阵S SS相乘的形式。其中,m mm为用户的数量,n nn为物品的数量,k kk为隐向量(Latent Factor)的维度。k kk的大小决定了隐向量表达能力的强弱,实际应用中,其取值要经过多次的实验来确定。在得到了用户矩阵U UU和物品矩阵I II后,将两个矩阵相乘,就可以得到一个新的矩阵。那么,我们就对未被评价过的物品,有了一个预测评分。接下来,可以将评分进行排序,推荐给用户。这就是矩阵分解对于推荐系统最基本的用途。

用大白话总结一下,矩阵分解的目的就是通过分解之后的两矩阵内积,来填补缺失的数据,用来做预测评分。矩阵分解的核心是将矩阵分解为两个低维的矩阵的乘积,分别以k kk维的隐因子向量表示,用户向量和物品向量的内积则是用户对物品的偏好度,即预测评分。值得注意的是k kk的选取是通过实验和经验而来的,因此矩阵分解的可解释性不强。

三、矩阵分解的方法

Funk-SVD的核心思想认为用户的兴趣只受少数几个因素的影响,因此将稀疏且高维的User-Item评分矩阵分解为两个低维矩阵,即通过User、Item评分信息来学习到的用户特征矩阵P和物品特征矩阵Q,通过重构的低维矩阵预测用户对产品的评分。由于用户和物品的特征向量维度比较低,因而可以通过梯度下降(Gradient Descend)的方法高效地求解。
但是Funk-SVD如何将矩阵M分解成为P和Q呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。即通过 User-Item 评分信息来学习到的用户特征矩阵 P 和物品特征矩阵 Q,通过重构的低维矩阵预测用户对物品的评分。

这里通过loss函数,为了防止过拟合,采用正则化的方法。

四、矩阵分解的步骤

1.首先我们要定义一个类似于上图的评分矩阵,用R表示,其维度为N × M,也就是R为N 行M列矩阵。
然后我们将其分解P矩阵与Q矩阵,其中P矩阵维度为N × K ,Q矩阵维度为K × M 
于是我们可以得到
R ≈ R\approxR≈ R ^ = P × Q 
R =P×Q
对于P,Q矩阵的解释,直观上,P矩阵是N 个用户对K个主题的关系,Q矩阵是K个主题跟M个物品的关系,至于K个主题具体是什么,在算法里面K是一个参数,需要调节的,通常10 ∼ 100 之间。

矩阵分解算法
 

 矩阵分解算法

矩阵分解算法 

矩阵分解算法 

五、代码实现

import numpy as np
import math
import matplotlib.pyplot as plt

#定义矩阵分解函数
def Matrix_decomposition(R,P,Q,N,M,K,alpha=0.0002,beta=0.02):
    Q = Q.T #Q 矩阵转置
    loss_list = [] #存储每次迭代计算的 loss 值
    for step in range(5000):
        #更新 R^
        for i in range(N):
            for j in range(M):
                if R[i][j] != 0:
                    #计算损失函数
                    error = R[i][j]
                    for k in range(K):
                        error -= P[i][k]*Q[k][j]
                    #优化 P,Q 矩阵的元素
                    for k in range(K):
                        P[i][k] = P[i][k] + alpha*(2*error*Q[k][j]-beta*P[i][k])
                        Q[k][j] = Q[k][j] + alpha*(2*error*P[i][k]-beta*Q[k][j])
                    
        loss = 0.0
        #计算每一次迭代后的 loss 大小,就是原来 R 矩阵里面每个非缺失值跟预测值的平方损失
        for i in range(N):
            for j in range(M):
                if R[i][j] != 0:
                    #计算 loss 公式加号的左边
                    data = 0
                    for k in range(K):
                        data = data + P[i][k]*Q[k][j]
                    loss = loss + math.pow(R[i][j]-data,2)
                    #得到完整 loss 值
                    for k in range(K):
                        loss = loss + beta/2*(P[i][k]*P[i][k]+Q[k][j]*Q[k][j])
                    loss_list.append(loss)
        plt.scatter(step,loss)
        #输出 loss 值
        if (step+1) % 1000 == 0:
            print("loss={:}".format(loss))
        #判断
        if loss < 0.001:
            print(loss)
            break
    plt.show()    
    return P,Q
        
if __name__ == "__main__":
    N = 5
    M = 4
    K = 5
    R = np.array([[5,3,0,1],
                [4,0,0,1],
                [1,1,0,5],
                [1,0,0,4],
                [0,1,5,4]]) #N=5,M=4
    print("初始评分矩阵:")
    print(R)
    #定义 P 和 Q 矩阵
    P = np.random.rand(N,K) #N=5,K=2
    Q = np.random.rand(M,K) #M=4,K=2
    
    print("开始矩阵分解:")
    P,Q = Matrix_decomposition(R,P,Q,N,M,K)
    print("矩阵分解结束。")
    print("得到的预测矩阵:")
    print(np.dot(P,Q))

六、矩阵分解的优缺点


1.优点
1.比较容易编程实现,随机梯度下降方法依次迭代即可训练出模型。比较低的时间和空间复杂度,高维矩阵映射为两个低维矩阵节省了存储空间,训练过程比较费时,但是可以离线完成;评分预测一般在线计算,直接使用离线训练得到的参数,可以实时推荐。
2.预测的精度比较高,预测准确率要高于基于领域的协同过滤以及内容过滤等方法。
3.非常好的扩展性,很方便在用户特征向量和物品特征向量中添加其它因素,例如添加隐性反馈因素的SVD++,;添加时间动态Time SVD++,此方法将偏置部分和用户兴趣都表示成一个关于时间的函数,可以很好的捕捉到用户的兴趣漂移。

2.缺点
1.模型训练比较费时。
2.推荐结果不具有很好的可解释性,分解出来的用户和物品矩阵的每个维度无法和现实生活中的概念来解释,无法用现实概念给每个维度命名,只能理解为潜在语义空间。文章来源地址https://www.toymoban.com/news/detail-402367.html

到了这里,关于矩阵分解算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法

    🌸个人主页:JOJO数据科学 📝个人介绍: 统计学top3 高校统计学硕士在读 💌如果文章对你有帮助,欢迎✌ 关注 、👍 点赞 、✌ 收藏 、👍 订阅 专栏 ✨本文收录于【推荐系统入门到项目实战】 本系列主要分享一些学习推荐系统领域的方法和代码实现。 之前我们介绍了推荐

    2024年02月06日
    浏览(44)
  • 理解非负矩阵和张量分解:快速算法的Matlab实现与优化实践

    第一部分:非负矩阵分解(Non-negative Matrix Factorization,NMF)的基本原理 非负矩阵分解(NMF)是一种广泛应用的线性代数技术,特别适用于大规模的数据集分析。其基本思想是将一个非负矩阵分解为两个低秩的非负矩阵的乘积,使得矩阵的内在结构得以暴露并利于进一步分析。

    2024年02月16日
    浏览(54)
  • 大数据课程K18——Spark的ALS算法与显式矩阵分解

    文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州 ⚪ 掌握Spark的ALS算法与显式矩阵分解; ⚪ 掌握Spark的ALS算法原理; 我们在实现推荐系统时,当要处理的那些数据是由用户所提供的自身的偏好数据,这些数据被称作显式偏好数据,由显示偏好数据建立的矩阵称

    2024年02月09日
    浏览(33)
  • 机器学习实战教程(四):从特征分解到协方差矩阵:详细剖析和实现PCA算法

    方差和标准差的原理和实例演示,请参考 方差 方差(Variance)是度量一组数据的分散程度。方差是各个样本与样本均值的差的平方和的均值: 标准差 标准差是数值分散的测量。 标准差的符号是 σ (希腊语字母 西格马,英语 sigma) 公式很简单:方差的平方根。 协方差 通俗

    2024年02月02日
    浏览(51)
  • C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

    安德烈·路易斯·乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lycée e,并于1892年11月14日获得学士学位的第一部分,于1893年7月24日获得第二部分。1895年10月15日,乔尔斯基进入莱科尔理工学院,在当年223名入学学生中排名第88位。他在莱科尔理工

    2024年02月22日
    浏览(40)
  • 用Python实现概率矩阵分解(PMF)算法在MovieLens ml-100k数据集上构建精确的推荐系统:深入理解GroupLens数据的操作

    第一部分:推荐系统的重要性以及概率矩阵分解的介绍 在如今的数字化时代,推荐系统在我们的日常生活中起着重要的作用。无论我们在哪个电商网站上购物,哪个音乐平台听歌,或者在哪个电影网站看电影,都会看到推荐系统的身影。它们根据我们的喜好和行为,向我们推

    2024年02月15日
    浏览(42)
  • 矩阵分析——矩阵分解

    矩阵分解指的是将复杂的矩阵分解成比较简单的矩阵的乘积的形式。在数值代数、矩阵论和最优化应用。 三角分解: 矩阵的三角分解:将一个方阵 A pmb{A} A A 分解成一个下三角阵 L pmb{L} L L 和一个上三角矩阵 R pmb{R} R R 的乘积,即 A = L R pmb{A}=pmb{L}pmb{R} A A = L L R R 。 充分必

    2024年02月02日
    浏览(41)
  • 一分钟读懂:矩阵的特征值分解、奇异值分解和伪逆矩阵

    通过把矩阵运算分解成多个矩阵的乘法,可以简化矩阵运算,也可发现对应线性变换的一些内在规律和特性。根据不同的目的,有不同的分解策略。本文我们讨论最常用的特征值分解和奇异值分解。 定义了矩阵的加、减、乘、除(逆)运算后,数学家们自然希望探索矩阵更多

    2024年02月03日
    浏览(51)
  • 【矩阵论】2. 矩阵分解——SVD

    矩阵论的所有文章,主要内容参考北航赵迪老师的课件 [注]由于矩阵论对计算机比较重要,所以选修了这门课,由于不是专业搞数学的,所以存在很多口语化描述,而且对很多东西理解不是很正确与透彻,欢迎大家指正。我可能间歇性忙,但有空一定会回复修改的。 矩阵论

    2023年04月08日
    浏览(101)
  • 矩阵分析与计算学习记录-矩阵分解

    本章重点内容: 满秩分解:存在性、方法 三角分解:Doolittle分解、两种求解方法、cholesky分解 QR分解:定义、Householder变换、Givens变换、Schmidt正交化方法求QR分解、上Hessenberg矩阵 奇异值分解     下面看个例子,对矩阵进行满秩分解   矩阵的三角分解是最基本的一种矩阵分解

    2024年02月01日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包