第十七章 推荐系统

该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。

本章含盖

  • 17.1 问题规划
  • 17.2 基于内容的推荐算法
  • 17.3 协同过滤
  • 17.4 协同过滤算法
  • 17.5 低轶矩阵分解
  • 17.6 实施细节:均值规范化

17.1 问题规划

在接下来的视频中,我想讲一下推荐系统。我想讲推荐系统有两个原因:

第一、仅仅因为它是机器学习中的一个重要的应用。在过去几年,我偶尔访问硅谷不同的技术公司,我常和工作在这儿致力于机器学习应用的人们聊天,我常问他们,最重要的机器学习的应用是什么,或者,你最想改进的机器学习应用有哪些。我最常听到的答案是推荐系统。现在,在硅谷有很多团体试图建立很好的推荐系统。因此,如果你考虑网站像亚马逊,或网飞公司或易趣,或iTunes Genius,有很多的网站或系统试图推荐新产品给用户。如,亚马逊推荐新书给你,网飞公司试图推荐新电影给你,等等。这些推荐系统,根据浏览你过去买过什么书,或过去评价过什么电影来判断。这些系统会带来很大一部分收入,比如像亚马逊和网飞这样的公司。因此,对推荐系统性能的改善,将对这些企业的有实质性和直接的影响。

推荐系统是个有趣的问题,在学术机器学习中因此,我们可以去参加一个学术机器学习会议,推荐系统问题实际上受到很少的关注,或者,至少在学术界它占了很小的份额。但是,如果你看正在发生的事情,许多有能力构建这些系统的科技企业,他们似乎在很多企业中占据很高的优先级。这是我为什么在这节课讨论它的原因之一。

我想讨论推荐系统地第二个原因是:这视频的最后几集我想讨论机器学习中的一些大思想,并和大家分享。我们已经在这门课中看到,特征对于机器学习来说,是非常重要的,你所选择的特征,将对你学习算法的性能有很大的影响。因此,在机器学习中有一种大思想,对于一些问题,可能并不是所有的问题,而是一些问题,有一些算法可以自动地学习一系列适合的特征。所以,比起手动设计或编写特征(这也是我们目前做得最多的事),这里有一些环境,能让你开发某个算法,来学习使用哪些特征。而推荐系统就是那些环境中的一个例子,当然还有很多其他的,但是通过推荐系统,我们将领略一小部分,特征学习的思想,至少,你将能够了解到这方面的一个例子,我认为,机器学习中的大思想也是这样。因此,让我们开始讨论推荐系统问题形式化。

我们从一个例子开始定义推荐系统的问题。 假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。

这里引入一些标记:

17.2 基于内容的推荐算法

在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。

在我们的例子中,我们可以假设每部电影都有两个特征,如x_1代表电影的浪漫程度,x_2 代表电影的动作程度。 所以,如果我们有类似这样的特征,那么每部电影就可以用一个特征向量来表示。同往常一样,我们再加一个额外特征,称为截距特征 x_0,它的值总是 1 。

然后,我们就能有一个特征向量,如x^(1)是第一部电影的特征向量

n 表示 特征 数量,但是不包括 x_0。因此,本例中,n = 2.

下面我们要基于这些特征来构建一个推荐系统算法。 假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如θ^((1))是第一个用户的模型的参数。 于是,我们有:

代价函数

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

其中 i:r(i,j)=1表示我们只计算那些用户 j 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以1/2m(这里,可以说是 m^(j) ),在这里我们将m去掉。并且我们不对方差项θ_0进行正则化处理。

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

如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:

?这就是如何最小化代价函数J,来学习所有的参数。用这些求导公式的时候,如果你想,你可以把它们代入到一个更高级的优化算法中。比如,簇梯度或者LBFGS等等,并用它们来最小化代价函数J。

17.3 协同过滤

在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。

但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。 我们所讲算法有一个很有意思的特性,叫做“特征学习”。这种算法能够自行学习所需要的特征。

假设,我们没有电影本身的特征(如,浪漫程度、动作程度),只有用户对电影的打分。并且已知 θ^(j) :

注:θ_0 = 0。 有了,用户对电影的评分,以及 θ^(j),理论上,我们就能得到电影的特征 x_1 和 x_2 的值。

给定 θ,学习某个电影的特征:

总结一下,这一阶段要做的就是选择特征 x^(i),让所有已经评价过电影的用户 j ,使得算法预测出的用户对电影评分与用户实际对该电影的评分的平方误差最小。

学习所有电影的特征:

最终你将得到合适的,所有电影的特征。

给定 x ,你能估算出 θ;而,给你 θ 的话,你能估算出 x。这就有点类似“先有鸡,还是先有蛋”的问题了。。

实际上,随机的猜取一些 θ 值,在有了这些随机初始化的 θ 值以后。你就能用这些 θ 值来学习出 x。然后,在有这些初始化的特征(x)之后,你就能运用其得到更好的 参数θ值的估计。依次类型。。。我们将这个迭代过程不断地重复执行,我们能得到很好的 θ 和 x,并且效果确实很好。如果你重复这个过程,你的算法将会收敛到一组合理的电影特征以及一组合理的对不同用的参数θ的估计。

对于这个问题,该问题仅建立在每位用户对数个电影进行了评价,并且每部电影都被数位用户评价过的情况下。这样你才能够重复这个迭代过程,来估计出 θ 和 x。

这就是基本的“协同过滤”算法,这实际不是最后,我们将要使用的算法,下一个视频我们将介绍如何改进该算法,让其在计算时更为高效。 “协同过滤”算法指的是,当你执行算法时,要观察大量的用户,观察这些用户的实际行为,来协同的得到更佳的每个人对电影的评分值。

17.4 协同过滤算法

实际上存在一个更有效的算法,比 “迭代循环的一次计算出 θ 值后,在使用该 θ 值估计出新的 x,再使用该 x 估算出新的 θ 值。。。以此类推” 这样的算法更有效。它能够将 x 和 θ 同时计算出来。我们所要做的就是将

结合为一个(注意,这里是“结合”,不是“相加”的意思):

实际上:

是相同的。虽然,可能它们两个求和看起来有点不同。但让我们来看看它们到底在做什么。 第一个求和运算是,所有用户 j 的总和 所有被用户评分过的电影总和。这其实是将,所有 (i,j) 对全加起来。每一项对应被某一用户评分过的某一电影。 而第二个求和运算,进行相反的运行。它表示对每部电影 i,将所有对它评分过的用户 j 求和。 这两个运算符都是对所有 (i,j) = 1 的 (i,j) 对求和。就是对所有有评分的 用户-电影 对进行求和。

所以,?这两个式子其实就是这一项:

?这个优化目标函数 J 有一个很有趣的特性,如果你假设 x 为常数,并关于 θ 优化的话,它实际上就是

。反过来也一样,如果你把 θ 作为常数量,然后关于 x 求 J 的最小值的话,那就是

同时,在最小化

时,我们不再遵循 x_0 = 1 这惯例。而是,我们将 x 特征向量定义为一个 n 为向量(之前,我们不需要学习 x 特征向量时,它是一个 n+1 维向量),同样,因为参数 θ 具有相同的维度,所以 θ 也是 n 维的,因为,如果没有 x_0 的话,那么 θ_0 也不再需要。 我们放弃这个惯例(x_0 = 1)的理由是,我们现在是在学习所有的特征,我们没有必要将一个特征值硬编码为 1。因为,如果算法真的需要,一个特征永远为1,它可以选择靠自己去获得 1 这个数值。

  1. 首先,我们将会把 x 和 θ 初始化为小的随机值。这一点,有点像神经网络训练。
  2. 接下来,我们要用梯度下降或者其他的高级优化算法把这个代价函数最小化。如果你求导的话,你会发现梯度下降法写出来的更新式是这样的:
  1. 最后,给你一个用户。如果这个用户具有一些参数 θ,以及给你一部电影,学习得到的特征 x。我们可以预测该用户给电影 j 的评分(该用户还未对电影 j 进行过评分)

“协同过滤”算法可以同时学习几乎所有电影的特征 x 和所有用户参数 θ。能对不同用户会如何对他们尚未评分的电影做出评价给出相当精准的预测。

通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。 例如,如果一位用户正在观看电影 x(i),我们可以寻找另一部电影x(j),依据两部电影的特征向量之间的距离 ∥x(i)-x(j) ∥ 的大小。

17.5 低轶矩阵分解

在上几节视频中,我们谈到了协同过滤算法,本节视频中我将会讲到有关该算法的向量化实现,以及说说有关该算法你可以做的其他事情。 举例子: 1.当给出一件产品时,你能否找到与之相关的其它产品。 2.一位用户最近看上一件产品,有没有其它相关的产品,你可以推荐给他。

我将要做的是:实现一种选择的方法,写出协同过滤算法的预测情况。

我们有关于五部电影的数据集,我将要做的是,将这些用户的电影评分,进行分组并存到一个矩阵中。

我们有五部电影,以及四位用户,那么 这个矩阵 Y 就是一个5行4列的矩阵,它将这些电影的用户评分数据都存在矩阵里:

向量化表示:

现在给定?这个预测评分矩阵,则有一个,比较简单的或者向量化的方法来写出它们:

预测评分矩阵Y = X * Θ^T

这个协同过滤算法有另一个名字,叫做“低秩矩阵分解”。这个术语来源于这个矩阵的数学性质,矩阵 X 乘以 Θ的转置,在线性代数中有一个数学性质,称为“低秩矩阵”

一个 m * n 的矩阵,如果秩很低(秩r远小于m,n),则它可以拆成一个 m * r 矩阵和一个 r * n 矩阵之积(类似于SVD分解)。后面这两个矩阵所占用的存储空间比原来的 m * n 矩阵小得多。

另一个问题,利用已经学习到的属性,来找到相关的电影。

具体的说,就是对每个商品 i ,比如对每个电影 i 我们已经学到一个属性向量 x^(i): 当你学习某一组特征时,你之前并不知道该选取哪些不同的特征,但是如果你运行这个算法,一些特征将被捕捉到,有关电影和商品的重要方面。这些重要的方面将导致一些用户喜欢某些电影。 在学习完特征之后,实际上,很难理解,这些被学习到的特征,并对这些特征给出人类可以理解的解释。但是,实际上,即使这些特征难以可视化,但通常,算法将学到一些有意义的特征。 现在既然你已经对特征参数向量进行了学习,那么我们就会有一个很方便的方法来度量两部电影之间的相似性。例如说:电影 i 有一个特征向量x^(i),你是否能找到一部不同的电影 j,保证两部电影的特征向量之间的距离x(i)和x(j)很小,那就能很有力地表明电影i和电影 j 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 i,或许更有可能也对电影 j 感兴趣。总结一下,当用户在看某部电影 i 的时候,如果你想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,你需要做的是找出电影 j,在这些不同的电影中与我们要找的电影 i 的距离最小,这样你就能给你的用户推荐几部不同的电影了。

通过这个方法,希望你能知道,如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算。同时希望你也能掌握,通过学习特征参数,来找到相关电影和产品的方法。

17. 6 实施细节:均值规范化

均值归一化,有时候它能让算法运行的更好。

均值归一化的作用: 举例:有一个没有给任何电影评分的用户(Eve)

因为 Eve 用户没有给任何一部电影评过分,所以代价函数 J 的第一项

完全不影响 θ^5 的值(因为,不存在 r(i,j) = 1)。所以,影响 θ^5 值的唯一项就是

。也就是说,我们想选一个向量 θ^5 使得这个

正则化项尽可能小。这会导致你最终得到 θ^5 = [0 ; 0]。而这样的话,用户 Eve 对任意电影的打分都将会是 0 分,因为 Eve 对任意电影的预测打分为 (θ^5 )^T * x^(i)

均值归一化的想法,可以让我们解决这个问题。

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

然后我们利用这个新的 Y 矩阵来训练算法。 如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测

,对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。

PS :你可以认为,这样推荐给 Eve 的电影,就是那么评分高的热门电影了。而对于这个情况,也就相当于对一个新用户,我们应该推荐什么样的内容?

同时,我们目前是对行进行均值归一化,以解决当一个用户没有对任何一部电影进行评分时的情况;同样,如果一部电影没有被任何一个用户所评分过,我们也可以对矩阵的列进行均值归一化,以解决这个问题。

“均值归一化”作为“协同过滤”算法的预处理步骤,根据不同的数据集,它有时能让你的算法表现得更好一些。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券