【MF】SVD

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

 

矩阵分解有俩种方法,分别是 EVD(特征值分解) 和 SVD(奇异值分解),在推荐系统中许多矩阵是非对称的,并且不是方阵,因此一般在应用过程当中采用SVD。code

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

 代码如图所示:ip

#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的评分,能够获得:ci

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)it

 

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

 

 

 

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

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

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

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

 

存在的使用局限:

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

若是咱们要对缺失值进行补全,填充的方式通常简单粗暴,从而形成数据的噪音大。

相关文章
相关标签/搜索