推荐系统,协同过滤算法

推荐系统,顾名思义,就是推荐东西。

无论是视频网站,比如爱奇艺、腾讯视频,还是销售网站,比如淘宝、京东,都需要向用户推荐视频或者商品,而如何向用户推荐所喜欢的视频或者商品,这就需要建立一个良好的推荐系统。没有好的推荐系统,那么这个网站很难在现在的互联网大环境下生存下去。

一、推荐系统

下面从一个例子开始定义推荐系统的问题。

假使我们是一个电影供应商,我们有5部电影和4个用户,我们要求用户为电影打分,如下:

推荐系统,协同过滤算法_第1张图片

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

下面引入一些标记:

 代表用户的数量

代表电影的数量

如果用户 j 给电影 i 评过分,则 

代表用户 j 给电影 i 的评分

代表用户 j 评过分的电影的总数

x1代表电影的浪漫程度,是电影的第一个特征

x2代表电影的动作程度,是电影的第二个特征

用户 j 的参数向量

电影 i 的特征向量

对于用户 j 和电影 i ,我们预测评分为: 

代价函数

针对用户 j ,该线性回归模型的代价为预测误差的平方和,加上正则化项:

其中,表示我们只计算用户评过分的电影。在一般的线性回归模型中,误差项和正则项都是乘以 1/2m,在这里我们将 m去掉(以前谈过,不影响结果),并且我们不对方差项进行正则化处理(按照以前的惯例)。

上面的代价函数只是针对一个用户,下面我们将所有用户的代价函数求和:

若用梯度下降求解最优解,则更新公式如下:

推荐系统,协同过滤算法_第2张图片

二、协同过滤

在以上的内容中,对于每一部电影,我们掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。如下所示:

推荐系统,协同过滤算法_第3张图片

但是如果既没有用户的参数,也没有电影的特征,这两种方法都不可行。而协同过滤算法可以同时学习这两者。

我们的优化目标便改为同时针对 x 和 θ 进行。

推荐系统,协同过滤算法_第4张图片

梯度下降如下:

推荐系统,协同过滤算法_第5张图片

注:在协同过滤算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。协同过滤算法使用步骤如下:

1.初始化  为一些随机数

2.使用梯度下降算法最小化代价函数

3.在训练完算法后,我们预测为 用户 j 给电影 i 的评分

通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为向用户推荐电影的依据。

例如,如果一位用户正在观看电影 ,我们可以寻找另一部电影,依据两部电影的特征向量之间的距离的大小来查找,可以理解为类型相似度。

三、向量化:低秩矩阵分解

我们依然用上面电影评分的例子。将评分矩阵化,如下:

推荐系统,协同过滤算法_第6张图片

而这个矩阵可由下面的矩阵计算得来:

推荐系统,协同过滤算法_第7张图片

我们令

推荐系统,协同过滤算法_第8张图片

可以得到

                         Y = Xθ'

四、均值归一化

下面再让我们谈谈均值归一化在推荐系统中的应用。

我们依然用电影评分的例子。在下图中,新增一个用户Eve,且这个用户并未对任何电影评过分。

推荐系统,协同过滤算法_第9张图片

倘若我们并未进行均值归一化,依然按照上面的协同过滤算法进行学习,那么为了使代价函数最小,会出现以下的情况:

即新增用户Eve 的参数全为0,也就是说,评分全为0,如下:

这显然不符合实际情况(怎么可能都为0)。

下面我们开始使用均值归一化,得到合理的评分。

首先需要对Y矩阵进行均值归一化处理,将每一个用户对某一个电影的评分减去所有已评分用户对该电影评分的平均值,如下:

推荐系统,协同过滤算法_第10张图片

然后利用这个新的 Y 矩阵训练算法。

用新训练的算法来预测评分,需要将平均值重新加回去,预测,对于Eve,我们的新模型会认为他给每部电影的评分都是该电影的平均分。

你可能感兴趣的:(机器学习)