【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分解要求矩阵是稠密的,即矩阵都有元素,但是在实际业务过程中矩阵往往是稀疏的,存在大量缺失值。

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

原文地址:https://www.cnblogs.com/guangluwutu/p/12355938.html