斯坦福大学机器学习笔记——推荐系统(协同过滤、低秩分解、推荐系统)

这个博客让我们来讨论一下推荐系统,首先我们来讨论一下为什么学习推荐系统:
1. 推荐系统是机器学习中的一个重要应用,它已经用于很多企业中,比如淘宝、今日头条、亚马逊等。它们会根据你的浏览记录,当你再次访问时,会给你推荐一些你感兴趣的东西。
2. 我们从前面学过的机器学习知道,对于一个算法特征的选择,对算法性能的影响很大。而后面讲到的推荐系统的建立过程中,该算法可以自动的学习一套很好的特征,而不需要试图手动设计。

下面我们用一个例子来简单的介绍什么是推荐系统的问题:
假如我们有一个电影推荐的问题,其中我们已有的数据为5部电影和4个用户,用户给电影打分,具体的打分如下:
这里写图片描述
其中,前三部是爱情片,后两部是动作片,“?”代表该用户没有给这不电影打分。
推荐问题是我们希望构建一个算法来预测他们每个人可能会给他们没有看过的电影打多少分,根据这个预测结果的高低来判断是否将其推荐给用户。

基于内容的推荐系统:
基于内容的推荐系统我们假设对于我们推荐的东西有一些数据,这些数据也就是这些东西的特征。
我们还是以上面的那个例子来说明一下基于内容的推荐系统,我们假设每部电影有两个特征,其中 x1 代表电影的浪漫程度, x2 代表电影的动作程度,则数据集可以表示为:
这里写图片描述
下面我们基于这些特征来构建一个推荐系统的算法。假设我们采用线性回归模型,我们对每一个用户都训练一个线性回归模型,首先我们对使用的参数进行介绍。
θ(j) 代表用户j的参数向量; x(i) 代表电影i的特征向量; (θ(j))Tx(i) 代表用户j对电影i我们预测的评分; nu 代表用户的数量; nm 代表电影的数量; i:r(i,j) 表示我们只计算那些用户j评过分的电影。
于是针对用户j,该线性模型的代价函数为预测误差的平方,所以该代价函数的表达式为(带有正则项):
这里写图片描述
对于推荐系统,我们对上式进行了简化,将原来除以2m去掉,对最终的结果没有影响。
上面的表达式只是针对第j个用户建立的,为了学习所有用户,我们可以将代价函数形式表示为:
这里写图片描述
我们使用梯度下降法来求解最优解,我们的代价函数对参数求偏导数之后的更新公式为:
这里写图片描述
上述的过程就是基于内容的推荐系统的构建过程。

协同过滤算法:
前面我们讲述了基于内容的推荐系统的设计,它是在我们掌握了可用的特征之后,使用这些特征训练出每一个用户的参数;相反地,如果我们拥有用户的参数,我们也可以学习得出电影的特征,数据集的形式如下:
这里写图片描述
则对应的第i个电影的特征建立的代价函数的表达式为:
这里写图片描述
同样我们可以学习所有电影的特征,我们可以将代价函数的形式表示为:
这里写图片描述
所以对于给定的 x(1),...,x(nm) 我们能够估计出 θ(1),...,θ(nu) ;对于给定的 θ(1),...,θ(nu) 我们能够估计出 x(1),...,x(nm)
但是,如果我们既没有用户的参数,也没有电影的特征,以上两种方法都不能适用,所以我们引入了一种新的方法——协同过滤。它可以同时学习参数以及特征,下面我们讨论一下协同过滤算法的构建过程:
1. 初始化 x(1),...,x(nm) θ(1),...,θ(nu) 为随机的很小的值
2. x(1),...,x(nm) θ(1),...,θ(nu) 构建代价函数:
这里写图片描述
3. 使用梯度下降法最小化代价函数,对于每一个 j=1,2,...,nu 以及每一个 i=1,2,...,nm 更新公式为:
这里写图片描述
4. 在训练算法完成后,我们预测 (θ(j))Tx(i) 为用户j给电影i的评分。
协同过滤的过程可以理解为,初始化参数 θ 训练得到更好的特征,然后使用更好的特征训练得到更好的参数,然后更好的参数得到更好的特征,不断重复下去,直到得到最好的参数和特征。
推荐过程的实现为:如果我们得到用户j对于电影i的评价很高,同时电影的特征向量为 x(i) ,则我们可以通过计算另一个电影的特征向量 x(j) 与原来电影特征向量 x(i) 的距离来进行推荐,如果他们之间的距离很小,则可以进行推荐,如果他们之间的距离很大,则不进行推荐。

协同过滤算法(低秩矩阵分解)的向量化:
协同过滤算法也称为低秩矩阵分解,它可以通过向量化的方式实现。
这里写图片描述
对于上面的数据集我们可以通过右边的矩阵表示,同时我们能够对每个用户对每个电影的评估也可以用矩阵表示:
这里写图片描述
所以我们可以将每个电影的特征逐行表示,将每个用户的参数按行表示:

X=(x(1))T(x(2))T(x(nm))T

Θ=(θ(1))T(θ(2))T(θ(nu))T

则预测值可以通过 XΘT 求得。

实施过程中的细节——均值归一化:
如果我们对于上面的例子,新增加了一个用户Eve,他没有对任何电影评分,那么我们怎么对他进行电影推荐呢?也就是现在的数据集如下所示:
这里写图片描述
如果我们直接使用前面的协同过滤算法来最小化代价函数:
这里写图片描述
由于对于Eve来说,没有 (i,j)=r(i,j)=1 的项,所以对于代价函数的第一部分来说,其值等于零,所以为了最小化代价函数,所以会使得Eve对应的参数取值全为0,所以对于Eve最终预测的结果也会全部为零(表示的含义为Eve不喜欢任何电影),这样会使得Eve无可推荐的电影,所以我们要对数据进行处理。
处理的方法为对数据进行均值归一化:我们首先对结果矩阵Y进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
这里写图片描述
然后我们使用新的矩阵Y来训练算法。如果我们要用新训练的算法来预测评分则需要将平均值重新加回去,预测结果为: (θ(j))Tx(i)+μi ,所以对于Eve新模型会认为他给每部电影的评分为该电影的平均分,具有了实际意义(表示每部电影都可以,是大多数人的平均分)。

猜你喜欢

转载自blog.csdn.net/wyl1813240346/article/details/79065182