代码改变世界

推荐系统(Recommender Systems)

2018-07-07 14:29  bluemapleman  阅读(1071)  评论(0编辑  收藏  举报

本博客是针对Andrew Ng在Coursera上的machine learning课程的学习笔记。


基于内容的推荐(Content-based recommendation)

问题表述

假设我们有如下评分矩阵(纵向为同一用户的评分对不同电影的评分,横向为不同用户对同一部电影的评分):

这里写图片描述

$n_u$表示用户数目,$n_m$表示电影数目,$\theta{(j)}$表示用户j对电影特征的喜好程度参数(一个向量),$x$表示电影i的特征向量。当我们要预测用户j对电影i的评分时,就可以使用以下公式:$$Rating=(\theta{(j)})Tx^{(i)}$$

即用户对电影不同特征的喜好向量的转置,与电影的特征向量相乘。

问题范式

那么,用公式化的语言来总结上述的问题,形式如下:

这里写图片描述

总结而言,我们通过以$\theta{(j)}$为目标参数最小化损失函数(加上正则项),以学习到$\theta$的最优值,以用于预测用户j对于其尚未评分 的电影的评分。(删除$m^{(j)}$是因为其是一个常数,在最小化损失函数的过程中对结果没有影响)

接下来,我们将最优化目标做进一步转化:将所有需要预测的用户的损失函数加总在一起,得到我们最终的优化目标(如下图):

这里写图片描述

参数学习的方式还是用梯度下降(注意对截距项和非截距项参数的更新上,正则项是否存在的差别)

协同过滤(collaborative filtering)

问题引入

我们之前假设了已经获得了每部电影的特征向量,但实际情况中,往往电影的特征向量数据也可能没有,这种情况下,我们怎么预测用户对电影的评分呢?假设我们的每个用户已经告诉了我们他们对于不同的电影特征的喜好程度($\theta{(j)}$),那么根据$\theta$,以及已知的用户给电影的评分,我们可以大致判断某些电影中的特征向量的值:

这里写图片描述

最优化算法

给定各用户的喜好向量$\theta{(j)}$,我们以学习到电影的特征向量$x$为目的,以以下损失函数的最小化为优化目标(上面的式子是以学习到某电影i的特征向量为目的,下面的式子是一学习到所有电影的特征向量为目的):

这里写图片描述

上一个部分讲的是如何通过电影的特征向量和电影评分学习到用户的喜好向量,而协同过滤是通过用户的喜好向量学习到电影的特征向量,因此这两个过程的结果可以互相为对方所用,因此可以将结果交给对方交互进行学习过程,以达到最终最优的效果。

这里写图片描述

协同过滤的最优化目标

当我们将上述的两种学习过程组合在一起,便可以同时学习用户的喜好向量和电影的特征向量,这便是我们的协同过滤算法的最优化目标:

这里写图片描述

协同过滤算法

这里写图片描述

低阶矩阵因式分解(Low Rank Matrix Factorization)。

假设我们有以下四个用户对五部电影的评分数据(有部分缺失),我们将用户的评分放入一个矩阵Y:

这里写图片描述

我们可以通过协同过滤算法获得用户对于电影的完整的评分矩阵(用拟合模型获得估计评分填入缺失部分)。而如果想通过向量化的方式直接获得这个评分矩阵,可以对X和$\Theta$作处理,如下图:

这里写图片描述

而这里通过$X*\Theta^T$的做法其实就是低阶矩阵因式分解,因为获得的运算结果的完整评分矩阵就是一个被称为低阶矩阵的东西(名称来源)。


来自《集体智慧编程》的非负矩阵因式分解(Non-Negative Matrix Factorization)的参考内容,以帮助读者更好理解矩阵因式分解的知识:

对矩阵进行因式分解,其本质就是要找到两个更小的矩阵,使得二者相乘可以得到原来的矩阵,而这两个更小的矩阵分别称为特征矩阵和权重矩阵。


那么我们如何来找两部彼此相似度高的电影呢?

对于每个电影,我们可以得到它的一个特征向量$x^{(i)}\in R^n$,如下图,只需找到特征向量之间距离小的两部电影即可:

这里写图片描述

均值标准化(Mean Normalization)

同样,对于如下评分矩阵,我们用协同过滤的算法去尝试进行估计:

这里写图片描述

我们仍然将评分放入一个Y矩阵中,并可以算出每一行的一个均值,将Y的均值提取出来$\mu$,并利用均值将Y矩阵进行相应地改变:保证每一行均值不变的情况下,使得评分值均匀分布,这便是均值标准化的步骤:

这里写图片描述

然后,我们将均值标准化后的Y矩阵假设为我们从用户那边得到的真实评分矩阵,从该矩阵中学习参数$\theta{(j)}$和$x$。于是,当我们要预测用户j对电影i的评分值时,就可以用$(\theta{(i)})T(x^{(i)})+\mu_i$的方式来进行预测。那么这时,假若用户j的$\theta$为0向量(用户j没有对任何电影给过评分),我们即用其它用户对电影i的平均评分作为对用户j对电影i的评分值。