• 【MF】SVD


    矩阵分解是推荐系统的主流思想之一,它的思想是把矩阵拆解为多个矩阵的乘积。

    矩阵分解有俩种方法,分别是 EVD(特征值分解) 和 SVD(奇异值分解),在推荐系统中许多矩阵是非对称的,而且不是方阵,所以通常在应用过程中采用SVD。

    如图所示,我们可以认为A是uer/iterm矩阵,通过矩阵分解,我们可以得出User矩阵和Iterm矩阵。以及中间的元素是特征向量的对角矩阵。

     代码如图所示:

    #EVD
    import
    numpy as np A = np.array([[5,3], [1,1]]) lamda, U = np.linalg.eig(A) print('矩阵A: ') print(A) print('特征值: ',lamda) print('特征向量') print(U)
    #SVD
    from scipy.linalg import svd
    import numpy as np
    from scipy.linalg import svd
    A = np.array([[1,2],
            [1,1],
            [0,0]])
    p,s,q = svd(A,full_matrices=False)
    print('P=', p)
    print('S=', s)
    print('Q=', q)

    这么一倒腾,感觉也没什么作用。但是通过矩阵分解,我们可以使用较少特征值对矩阵A进行近似还原。

    如图,如果我们想看user2对iterm3的评分,可以得到:

    4=-0.46*16.47*(-0.29)+(-0.30)*6.21*(-0.38)+(-0.65)*4.40*(-0.13)+0.28*2.90*0.87+0.02*1.58*(-0.03)

    事实上,我们发现user的最后一列是没有用到的,我们可以把没有用到的行列抛掉,从而实现了数据的降维。甚至我们还可以使用更少的特征,去得到A的近似解。

     

    传统的SVD在推荐系统中的应用如下:

    使用K的个特征向量对矩阵降维

    从而将第i个用户对第j个物品的评分转化为行列式的求值,不仅可以进行并行计算,还节省了内存。

    通常,完整的SVD可以将M无损的分解成三个矩阵,但是为了简化矩阵分解,还可以使用较少的K对矩阵A进行近似还原。

    存在的使用局限:

    SVD分解要求矩阵是稠密的,即矩阵都有元素,但是在实际业务过程中矩阵往往是稀疏的,存在大量缺失值。

    如果我们要对缺失值进行补全,填充的方式一般简单粗暴,从而造成数据的噪音大。

  • 相关阅读:
    day23_雷神_git
    day23_雷神_crm-day2
    day21_雷神_django第四天
    day20_雷神_django第三天
    day19_雷神_django第二天
    day18_雷神_django第一天
    day17_雷神_数据库 小全
    day16_雷神_前端04
    awksedgrep 补充
    python 操作MongoDB非关系型数据库
  • 原文地址:https://www.cnblogs.com/guangluwutu/p/12355938.html
Copyright © 2020-2023  润新知