课堂笔记:矩阵分解

​​​​​​一、矩阵概念及乘法:

1.概念:

由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:

这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn

元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵 。

2.乘法运算:

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如Am×n矩阵和Bn×p矩阵,它们的乘积C是一个m×p矩阵,它的一个元素: Ci,j=ai,1·b1,j+ai,2·b2,j+······+ai,n·bn,j   ,                                                                                     并将此乘积记为:C=AB.

例如:

 矩阵的乘法满足以下运算律:

结合律:(AB)C=A(BC)

左分配律:(A+B)C=AC+BC

右分配律:C(A+B)=CA+CB

注意:矩阵乘法不满足交换律

二、矩阵分解:

1.性质:将矩阵拆解为数个矩阵的乘积。

2.常见分解法:三角分解法,QR分解法,奇异值分解法。

3.矩阵分解的作用:(1)分解后的每个小矩阵能够更容易的求逆;(2)分解后的每个小矩阵有特殊的物理意义。

4.应用:

~有如下R(5,4)的打分矩阵(“-”表示用户没有打分):其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数。

引出问题:那么,如何根据目前的矩阵R(5,4)对未打分的商品进行评分的预测(如何得到没有分值的用户的打分值)?~~矩阵分解可以解决。

~假设两个矩阵相乘可以得到一个预测矩阵,这个预测矩阵和原矩阵差值的平方小于某个值,那么就可以用预测矩阵中的值预测未评分用户的分值。

解决问题所需:

 ·预测矩阵公式:

 ·损失函数公式:

 ·梯度下降

 ·正则化

三、损失函数(代价函数)

1、损失函数是描述系统在不同参数值之下的损失。要应用损失的函数,其损失必须是通过某种媒介可以衡量的。

2.图像:

3.构建损失函数:用原矩阵和重新构建的评分矩阵之间的误差的平方作为损失函数,即:

然后:需要求解所有的非“-”项的损失之和的最小值,即:

四、梯度下降

1、梯度下降是迭代法的一种,可以用于求解最小二乘问题。

2.相关图像:

3.作用:获得修正的p和q的分量:

(1)求损失函数的负梯度:

(2)根据负梯度的方向更新变量:

注意:要不断更新直到minloss小于等于阈值。

五、正则化

1、正则化是代数几何中的一个概念,通俗来讲就是给平面不可约数曲线以某种形式的全纯参数表示。在这里,正则化的作用是防止过拟合。

2.加入正则化的损失函数如下:(涂色处为正则化项)

六、代码实现

# !/usr/bin/env python
# encoding: utf-8
__author__ = 'Scarlett'
#矩阵分解在打分预估系统中得到了成熟的发展和应用
# from pylab import *
import matplotlib.pyplot as plt
from math import pow
import numpy


def matrix_factorization(R,P,Q,K,steps=5000,alpha=0.0002,beta=0.02):
    Q=Q.T  # .T操作表示矩阵的转置
    result=[]
    for step in range(steps):
        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]+alpha*(2*eij*Q[k][j]-beta*P[i][k])
                        Q[k][j]=Q[k][j]+alpha*(2*eij*P[i][k]-beta*Q[k][j])
        eR=numpy.dot(P,Q)
        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))
        result.append(e)
        if e<0.001:
            break
    return P,Q.T,result

if __name__ == '__main__':
    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)

    N=len(R)
    M=len(R[0])
    K=2

    P=numpy.random.rand(N,K) #随机生成一个 N行 K列的矩阵
    Q=numpy.random.rand(M,K) #随机生成一个 M行 K列的矩阵

    nP,nQ,result=matrix_factorization(R,P,Q,K)
    print("原始的评分矩阵R为:\n",R)
    R_MF=numpy.dot(nP,nQ.T)
    print("经过MF算法填充0处评分值后的评分矩阵R_MF为:\n",R_MF)

#-------------损失函数的收敛曲线图---------------

    n=len(result)
    x=range(n)
    plt.plot(x,result,color='r',linewidth=3)
    plt.title("Convergence curve")
    plt.xlabel("generation")
    plt.ylabel("loss")
    plt.show()

运行结果:

   

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值