矩阵分解是推荐系统的主流思想之一,它的思想是把矩阵拆解为多个矩阵的乘积。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分解要求矩阵是稠密的,即矩阵都有元素,可是在实际业务过程当中矩阵每每是稀疏的,存在大量缺失值。
若是咱们要对缺失值进行补全,填充的方式通常简单粗暴,从而形成数据的噪音大。