矩阵分解

矩阵分解

1预测矩阵

预测矩阵一般用符号R`来表示,有

在这里插入图片描述

,(R`与R的维度相同,其中 是第i行第j列的元素值。

2构造损失函数(平方法)

使用原始的评分矩阵R与重新构建的评分矩阵之间的误差的平方作为损失函数,即:在这里插入图片描述

通过梯度下降法,更新变量:
求导:
在这里插入图片描述
在这里插入图片描述

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

3算法终止:

每次更新完R’ 后,计算一次loss值,若loss值非常小或者到达最大迭代次数,结束算法。于是就得到了我们最终的预测矩阵R’

4 过拟合问题与正则化

1 理论概述

啥也不懂
过拟合问题(over-fitting)指为了得到一致的假设而使假设变得过度严格(这里的假设可以理解为构建的函数模型)。简单来说就是在训练集中训练出过于完美的模拟,而在测试集中失效的问题。通俗来说就是拟合的越好,但相应预测的能力可能变得很差。
具体解决方法为正则化。即在损失函数加入正则项。 损失函数中加入正则化惩罚项:通常在求解的过程中,为了能够有较好的泛化能力,会在损失函数中加入正则项,以对参数进行约束。

5 矩阵分解与基于用户的协同过滤的比较

方法一:矩阵分解法

商品1商品2商品3商品4
用户A44.5233
用户B4.13154
用户C542
用户D243.019
用户E345

方法二:协同过滤算法

用户商品1商品2商品3商品4
用户A44.30535
用户B4.730545
用户C5424.272
用户D243.4813
用户E3454.000

6代码实现

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([[4,0,3,5],
                [0,5,4,0],
                [5,4,2,0],
                [2,4,0,3],
                [3,4,5,0]]) #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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值