推荐系统中的SVD算法

来源:互联网 发布:淘宝小二布置作业短信 编辑:程序博客网 时间:2024/05/20 13:09

很多人认为推荐系统的趋势是深度学习,我也非常同意这种观点,今年的ACM recsys首次开了deep learning work shop,youtube更是全面使用了深度学习来进行推荐。但不管怎么样(这神转折),SVD作为推荐系统领域非常经典的算法,还是值得和应该学习的。在查阅了一些资料后,我总结了SVD的三个套路。

(1) 用SVD对评分矩阵(预先对未评分项进行填充)进行分解,得到三个矩阵,取最重要的k个奇异值降维,然后三个矩阵再相乘重构出评分矩阵,此时评分矩阵是每个都有值的,可以根据评分值大小来做推荐。这是属于Model-based的推荐算法。

(2) 降维之后得到的U(m x k)和I(k x n)矩阵,可以分别用来做user-based(基于user的k个feature来进行相似度计算)和item-based的推荐(基于item的k个feature来进行相似度计算)。SVD降维的过程不仅是降低了维度,还进行了自动的特征提取。这是属于Memory-based的推荐算法。

(3) 没有利用到传统SVD的分解方法,用了梯度下降来求分解的矩阵。首先假设评分矩阵能被分解为U(m x k)和I(k x n)矩阵,k是超参数,然后初始化U和I的值,U和I相乘得到评分矩阵(m x n)然后与真实的评分进行比较(未评分项不需考虑,因此也不用纠结怎么填充未评分项),计算loss的梯度(还要加上正则项,这里为什么加正则项我不太理解),根据loss的梯度反复迭代更新U和I直到RMSE开始上升为止。这是属于Model-based的推荐算法。参考论文《A Guide to Singular Value Decomposition for Collaborative Filtering》
另外,有个ALS推荐算法(spark里面用到)也是基于这样的模型,但求解参数的思路不同,它是分别对每个u、i参数直接求解(令偏导=0),因此迭代的次数是m x k + k x n。

0 0