http://ling0322.info/2013/05/07/recommander-system.html

这个学期Web智能与社会计算的大作业就是完成一个推荐系统参加百度电影推荐算法大赛,成绩按照评测数据给分。老师介绍了N种方法包括基于内容的、以及协同过滤等等,不过他强烈建议使用矩阵奇异值分解的办法来做。也正因为是这个原因,我们一共8组其中6组的模型都是SVD。

这个比赛就是提供给你用户对电影的评分、电影的TAG、用户的社会关系(好友)、用户的观看纪录信息。其中用户对电影的评分满分是5分,大约8k用户、1w电影,然后根据以上的信息预测用户对某些电影的评分。然后评测结果就是跟用户实际评分的RMSE值。

SVD就是一种主成分分析以及降维的方法,大体思路就是一个对称矩阵A可以分解成对角形

P

其中可以写作

V

但是现实生活中很少有矩阵是对称的,比如上面的用户-电影矩阵。因此就诞生了奇异值分解的方法

V

其中T的特征值的根号。然后经过各种复杂的运算这个分解就完成了。奇异值分解的用途很广,主要是用作降维以及主成分分析。在自然语言中LSA主题模型就是基于奇异值分解,另外计算词与词之间的关系也要用到SVD。

使用SVD做推荐系统也可以看成是主成分分析的过程(此外还有另外一种解释就是将用户和电影投影到同一个向量空间中1),找到用户-电影矩阵中最大的r个奇异值,进行分解构成r行的矩阵U(代表用户)和r列的矩阵V(代表电影),这个就是各个用户对电影打分的主要的影响因素,依据这个就可以对于用户的打分进行预测。

但是这里情况很特殊,用户-电影矩阵十分稀疏,大约只有1%左右的项是有值的,对于这些项全部用0来填这个明显就是表示用户对这些电影打0分,这个是不合逻辑的,用平均值或者随机值填充效果也肯定不好。因此目前使用它的一种近似形式,对于用户-电影矩阵T 使得

)

最小,其中后半部分是防止过拟合而加入的因子。这个很明显可以使用随机梯度下降算法进行求解(关于随机梯度下降算法可以参考斯坦福机器学习第二课)

u

)

其中γ就是迭代的步长,我们使用Go语言实现了以上的迭代过程,以下是一些实验的结果数据

  1. λ=0.01, iter=100, r=20, RMSE=0.6483
  2. λ=0.01, iter=1000, r=20, RMSE=0.6618
  3. λ=0.05, iter=1000, r=20, RMSE=0.6298
  4. λ=0.1, iter=1000, r=20, RMSE=0.6534
  5. λ=0.05, iter=1000, r=50, RMSE=0.6298

其中iter表示迭代次数、λ=0.05的情况下是所有实验数据中最好的。r是因子的个数,这里对结果影响不大。

γ的值随着变化率动态改变,本来在代码中实现了这个功能的,但是因为实现之后发现程序太慢了,所以就去掉了。

最后在课程结束Presentation的时候,老师告诉我们其实好的推荐系统应该将TAG、用户社交关系等信息都加进去,这样的数据的结果才能够有大幅度的提升(因为我们都是用SVD做,结果大同小异)。此外,同学将均值以及用户的偏移加进去之后最好的结果是0.625左右(详细情况可以看推荐系统相关算法(1):SVD这篇文章)。

另外推荐一篇论文Matrix Factorization Techniques for Recommender Systems

相关文章:

  • 2022-12-23
  • 2021-08-29
  • 2021-10-01
  • 2021-06-30
  • 2021-10-15
猜你喜欢
  • 2021-08-04
  • 2021-05-05
  • 2021-11-07
  • 2021-11-20
  • 2021-10-03
  • 2021-08-08
相关资源
相似解决方案