一、问题形式化
在接下来的内容中,我将开始讲解推荐系统的一些理论知识。我们从一个例子开始定义推荐系统,假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分
前三部电影是爱情片,后两部是动作片,我们可以看出Alice和Bob似乎更倾向于爱情片,而 Carol 和 Dave 似乎更倾向于动作片,并且没有一个用户给所有的电影都打过分。因此我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据,下面引入一些标记:
二、基于内容的推荐系统
在基于内容的推荐系统中,项目或对象是通过相关特征的属性来定义的,系统基于用户评价对象的特征、学习用户的兴趣,考察用户资料与待预测项目的匹配程度。用户的资料模型取决于所用的学习方法,常用的有决策树、神经网络和基于向量的表示方法等。基于内容的用户资料需要有用户的历史数据,用户资料模型可能随着用户的偏好改变而发生变化。
在我们的例子中,我们假设每部电影都有两个特征,如代表电影的浪漫程度,代表电影的动作程度,则每部电影都有一个特征向量,如是第一部电影的特征向量为[0.9 0]。
下面我们要基于这些特征来构建一个推荐系统算法, 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如是第一个用户的模型的参数,下面引入一些标记:
其中 i:r(i,j)表示我们只计算那些用户 评过分的电影,在一般的线性回归模型中,误差项和正则项应该都是乘以1/2m,在这里我们将m去掉。并且我们不对进行正则化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
如果我们要用梯度下降法来求最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:
三、协同过滤
在之前的基于内容的推荐系统中,对于每一部电影我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了,协同过滤算法可以同时学习这两者,我们的优化目标便改为同时针对和进行,如下图:
对代价函数求偏导数的结果如下:
注:在协同过滤算法中我们通常不使用和项,如果需要的话算法会自动学得。 协同过滤算法使用步骤如下:
①初始为一些随机小值
②使用梯度下降算法最小化代价函数
③在训练完算法后,我们预测为用户 j 给电影 i 的评分
我们可以通过获得的特征矩阵作为给用户推荐电影的依据,例如如果一位用户正在观看电影,我们可以寻找另一部电影,选择使得两部电影的特征向量之间的距离最小。
四、向量化:低秩矩阵分解
在上几节内容中,我们谈到了协同过滤算法,本节中我将会讲到有关该算法的向量化实现以及说说有关该算法我们可以做的其他事情。
我们有五部电影以及四位用户,那么这个矩阵 Y 就是一个5行4列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
推出评分:
找到相关影片:
现在你已经对特征参数向量进行了学习,那么我们就会有一个很方便的方法来度量两部电影之间的相似性。例如说:电影 i 有一个特征向量,你是否能找到一部不同的电影 j,保证两部电影的特征向量之间的距离和很小,那就能很有力地表明电影i和电影 j 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 i,或许更有可能也对电影 j 感兴趣。
通过这个方法,希望你能知道如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算。同时希望你也能掌握,通过学习特征参数来找到相关电影和产品的方法。
五、推行工作上的细节:均值归一化
让我们来看下面的用户评分数据:
如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?我们首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值
然后我们利用这个新的 Y 矩阵来训练算法,如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测值为。对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。