1.协同过滤就是尽可能的找到和你相似的用户,将他们喜欢的电影推荐给你。这里面的问题就是,如果一个电影虽然很符合你的兴趣,但是你的朋友却很少有评价或观看过,那么协同过滤就很难将这个电影推荐给你。导致对稀疏数据的处理比较弱,头部效应明显,泛化能力差。
2.如图,评分矩阵中,每一行u代表每个用户,每一列s代表每个物品,矩阵中的数字代表着用户对物品的打分。我们通过数据构建的矩阵如图一样并不是一个满秩的矩阵。在真实的数据集里,矩阵的稠密度仅有3%左右。那么就意味着,矩阵中有绝大部分的评分是空白的。
而矩阵分解算法将 m×n 维的矩阵R分解为 m× k 的用户矩阵 U 和 k×n 维的物品矩阵 S 相乘的形式。其中, m 为用户的数量,n为物品的数量,k为隐向量(Latent Factor)的维度。 k 的大小决定了隐向量表达能力的强弱,实际应用中,其取值要经过多次的实验来确定。在得到了 用户矩阵U 和物品矩阵 S 后,将两个矩阵相乘,就可以得到一个满秩的矩阵。那么,我们就对未被评价过的物品,有了一个预测评分。
3.常见的矩阵分解算法
1.特征值分解(Eigendecomposition)
特征值只能作用于方阵,因此对于我们推荐系统用户-物品的矩阵不太合适。而特征值分解在PCA(主成分分析)中进行降维或人脸识别中运用却非常广泛
2.奇异值分解SVD(Singular Value Decomposition)
假设一个矩阵 M 是一个 m×n 的矩阵,则一定存在一个分解 :
SVD 需要原始的共现矩阵是稠密的。如果矩阵非常稀疏,求出奇异值的效果就会很差。而在推荐系统的场景中,很少有数据稠密的状态,这就使得奇异值分解在应用前需要进行数据填充。传统的SVD的在求奇异值时,计算复杂度非常的高。
3.Funk - SVD (Simon Funk SVD)
Funk-SVD提出是因为SVD在分解成三个矩阵的时候非常的耗时同时空间复杂度也很高,在面对稀疏数据时,SVD无法进行分解。而Funk-SVD完美的解决了SVD的不足,它仅将矩阵分解为两个矩阵,分解的目标是让分解后的两个矩阵乘积得到的评分矩阵和原始矩阵更拟合,也就是说与原始评分的残差最小。
Funk-SVD由于需要迭代优化损失函数,因此其训练过程比较耗时。