推荐系统

推荐系统(Recommender Systems)

推荐系统是机器学习中的一个重要的应用。 在淘宝上浏览某样东西时,下面可能会自动推荐你与之相似的东西;在你买电影票看电影时,APP可能会自动推荐类内容剧情差不多的电影。根据浏览你过去网购过什么东西,或过去看过什么电影,这些推荐系统会因为正确的推荐,勾起消费者的欲望而带来很大一部分收入(¥_¥)。

举一个本文一直都会用到的例子:

我们是一个电影供应商,我们有5部电影和4个用户,我们要求用户为电影打分。

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

协同过滤(Collaborative Filtering)

在一个基于内容的推荐系统算法中(比如上述例子),假设我们有每个电影的两个特征$x_1,x_2$分别表示电影的浪漫程度和动作程度:

我们的推荐系统就是基于这些特征来构建的。每部电影都有对应的一组特征向量来描述电影的内容,如$x^{(3)}=\begin{pmatrix}0.99&0\end{pmatrix}^T$。我们针对每一位用户都训练一个线性回归模型,比如$\theta^{(1)}=\begin{pmatrix}\theta_1^{(1)} & \theta_2^{(1)}\end{pmatrix}^T$表示的是通过训练的Alice的模型参数,也就是就是对样本点

进行线性回归并最小化代价函数求得的结果。

那么我们针对电影$i$与用户$j$的预测评分为$(\theta^{(j)})^Tx^{(i)}$。则线性回归模型的代价函数$J(\theta^{(j)})$为:

其中$r(i,j)$表示用户$j$是否评价过电影$i$,若$r(i,j)=1$则表示已经评分过;$y^{(i,j)}$表示用户$j$对电影$i$的评分。

上面的代价函数只是针对一个用户的,用$n_u$表示用户数,为了学习所有用户的参数,我们将所有用户的代价函数求和:

相反地,如果我们通过某种渠道得出每位用户的电影爱好口味$\theta^{(j)}$,但不知道每个影片的特征。我们也可以通过上面的方法给出训练结果$x^{(i)}$,用$n_m$表示用户数,可以通过计算下面代价函数来最优化每个影片的特征:

但是在通常情况下,如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。

我们将优化目标同时改为针对$x$与$\theta$一同进行,代价函数为:

用梯度下降法对代价函数进行最小化:

协同过滤算法使用步骤如下:

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

通过协同过滤获得的特征矩阵包含了有关电影的特征和参数数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。

例如,如果一位用户正在观看电影$x^{(i)}$,我们可以寻找另一部电影$x^{(j)}$,依据两部电影的特征向量之间的距离$\Vert x^{(i)}-x^{(j)}\Vert$的大小。