美文网首页
哲哲的ML笔记(三十二:推荐系统)

哲哲的ML笔记(三十二:推荐系统)

作者: 沿哲 | 来源:发表于2021-05-10 10:33 被阅读0次

    从一个例子开始定义操作系统

    一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分,星级从1-5,星级越高,评价越好


    图1

    前三部电影是爱情片,后两部则是动作片,我们可以看出Alice和Bob似乎更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据

    n_u:用户的数量
    n_m:电影的数量
    r(i,j):如果用户j给电影i评分了,r(i,j)=1
    y(i,j):用户j给电影i的评级

    基于内容的推荐系统

    假设每部电影都有两个特征,n=2。如x_1代表电影的浪漫程度,x_2 代表电影的动作程度。n_u=4, n_m=5

    图2
    根之前所学,我们假定x_0=1,对于第一个电影,特征向量为x^1=[1,0.9,0]

    用户j的参数向量\theta^j\in R^{n+1}
    电影i的特征向量x^i
    预测评分星级为(\theta^j)^Tx^i

    \theta^j的学习需要通过代价函数:
    \min_{\theta^j}\frac{1}{2}\sum_{i:r(i,j)=1}((\theta^j)^Tx^i-y(i,j))^2+\frac{\lambda}{2}\sum_{k=1}^{n}(\theta^j_k)^2

    i:r(i,j)=1表示只计算那些用户j评过分的电影,不对方差项\theta_0进行正则化处理
    为了学习所有用户,我们将所有用户的代价函数求和
    \min_{\theta^1,\theta^2……}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^j)^Tx^i-y(i,j))^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta^j_k)^2
    中间的部分就是J(\theta^1,\theta^2,……\theta^{n_u})
    用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:

    回到图2,假设通过梯度下降得到了\theta^1=[0,5,0], 预测用户1对第三部电影x^3=[1,0.99,0]的评分为(\theta^1)^Tx^3=4.95

    协同过滤

    对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
    \min_{x^1,x^2……,x^{n_m}}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^j)^Tx^i-y(i,j))^2+\frac{\lambda}{2}\sum_{j=1}^{n_m}\sum_{k=1}^{n}(x_k^i)^2

    如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。
    J=\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^j)^Tx^i-y(i,j))^2+\frac{\lambda}{2}\sum_{j=1}^{n_m}\sum_{k=1}^{n}(x_k^i)^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta^j_k)^2
    对代价函数求偏导数的结果如下:

    对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。
    给定x^1,x^2,……,x^{n_m},估计\theta^1,\theta^2……
    给定\theta^1,\theta^2,……,估计x^1,x^2,……

    1. 初始x^1,x^2,……,x^{n_m}, \theta^1,\theta^2,…… 为一些随机小值
    2. 使用梯度下降算法最小化代价函数
    3. 在训练完算法后,我们预测(\theta^j)^Tx^i为用户 j给电影i的评分

    低秩矩阵分解

    问题:

    1. 当给出一件产品时,你能否找到与之相关的其它产品。
    2. 一位用户最近看上一件产品,有没有其它相关的产品,你可以推荐给他。

    将上述电影的评分都存在矩阵里
    \begin{equation} Y = \left[ \begin{array}{ccc} 5 & 5 & 0 & 0\\ 5 & ?& ?& 0 \\ ?& 4 & 0 & ? \\ 0 & 0 & 5 & 4 \\ 0 & 0 & 5 &? \end{array} \right] \end{equation}

    有一个很方便的方法来度量两部电影之间的相似性。例如说:电影 i有一个特征向量x^i,你是否能找到一部不同的电影j ,保证两部电影的特征向量x^ix^j之间的距离和很小,那就能很有力地表明电影i和电影 j在某种程度上有相似,至少在某种意义上,某些人喜欢电影i ,或许更有可能也对电影 j感兴趣。总结一下,当用户在看某部电影 的时候,如果你想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,你需要做的是找出电影j ,在这些不同的电影中与我们要找的电影 i的距离最小,这样你就能给你的用户推荐几部不同的电影了。

    均值归一化

    用户评分数据


    如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?
    我们首先需要对结果Y矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:


    利用这个新的 Y矩阵来训练算法。 如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测(\theta^j)^Tx^i+\mu_i,对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。

    相关文章

      网友评论

          本文标题:哲哲的ML笔记(三十二:推荐系统)

          本文链接:https://www.haomeiwen.com/subject/ehordltx.html