- 这是本人在cousera上学习机器学习的笔记,不能保证其正确性,谨慎参考
- 看完这几课后
collaborative-filtering
collaborative-filtering-algorithm
vectorization-low-rank-matrix-factorization
同时参考下面的这篇文章:
SVD在推荐系统中的应用详解以及算法推导
后自己用java实现了一下
1、下图是待处理的数据,代码使用数据和下图一样:
2、思路:将一个“movie-user的评分矩阵”按照下面两图所示分解成两个矩阵theta和x,我们可以将其对应的理解为”user-特征”和”movie-特征”两个矩阵(特征类似上一篇文章中romance,action),n为“特征”的数目。为什么“movie-user的评分矩阵”可以分解,以及分解的n的大小如何确定我目前还没搞懂,在代码中,直接初始化”user-特征”和”movie-特征”两个矩阵,然后令n=2。然后采用梯度下降法不断的对”user-特征”和”movie-特征”中的每一个参数进行更新。
3、根据下图公式采用梯度下降法不断的对”user-特征”和”movie-特征”中的每一个参数进行更新,并加上正则化的作用:
4、对上图的公式对”user-特征”和”movie-特征”矩阵中的每一个参数进行求偏导数,偏导数的公式如下图:
5、下面是使用java进行了代码实现:
public class CollaborativeFilter {
private static int[][] rate_set = { { 5, 5, 0, 0 }, { 5, -1, -1, 0 },
{ -1, 4, 0