机器学习基础---推荐系统

一:问题规划

这一章中将讨论推荐系统的有关内容,它是在机器学习中的一个重要应用。

机器学习领域的一个伟大思想:对于某些问题,有一些算法可以自动地学习一系列合适的特征,比起手动设计或编写特征更有效率。这是目前做的比较多的研究,有一些环境能让你开发某个算法来学习使用那些特征。

接下里让我们通过推荐系统的学习来领略一些特征学习的思想。(还有其他很多算法自动进行特征学习)

(一)案例讲解(电影评分)---推荐系统问题的组成

某些公司让用户对不同的电影进行评价,用0到5星来评级,下面是用户的评价情况:

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

符号介绍:

nu表示用户的数量、nm表示电影的数量、

r(i,j)等于1时表示用户j给电影i进行了评价、

y(i,j)表示当评价后会得到的具体的评价星值。

推荐系统就是在给出了r(i,j)和y(i,j)的值后,会去查找那些没有被评级的电影,并试图预测这些电影的评价星级。例如,在上述图中给出的结果,从Alice和Bob的评价中,他们给爱情片的评价比较高,可能预测他们没看过的电影也是4到5星;而Carol和Dave的评价中,对爱情片的评价低,而动作片的评价不错,所以他们对没看过的爱情片的评价会是0,而对动作片的评价可能会是4到5星。

因此,如果想开发一个推荐系统,那么需要想出一个学习算法,能自动填补这些缺失值的算法(预测他们会如何评价那些他们还没有评价的电影)。这样就可以看到该用户还有哪些电影没看过,并推荐新的电影给该用户,可以去预测什么是用户感兴趣的内容。

这就是推荐系统问题的主要形式,接下来将讨论一个学习算法来解决这个问题。

二:基于内容的推荐算法---基于用户对不同电影的评分,从而进行推荐

介绍一种建立推荐系统的方法:基于内容的推荐算法

基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。

(一)案例回顾

例如上一节中提到的预测电影的例子,如何预测未评价的电影呢?假设对于每一部电影,都有一个对应的特征集(x_1用来衡量一部电影为爱情片的程度,x_2用来衡量为动作片程度),如下图所示:

现在为了做出预测,可以把每个用户的评价预测值看作是一个线性回归问题,特别规定,对于每一个用户j,要学习参数向量,通常来说,是一个n+1维,其中n是特征的数量。然后要预测用户j评价电影i的值,也就是参数向量与特征向量的内积()。

假如想预测用户1-Alice对电影3的评价,那么电影3会有一个参数向量,假如用某种方法得到了Alice的参数向量,那么Alice对电影3的预测就等于,如下图的计算:

所以,上面的操作就是对每一个用户应用了一个不同的线性回归的副本,上述给出了Alice的线性方程。同样的,其他用户都有一个不同的线性方程,这就是预测评价的方法。

(二)问题的正式定义

如果用户j给出了电影i的评价,就将r(i,j)记为1,而y(i,j)是对电影的评价的具体评价值;

是每个用户的一个参数,而是特定电影的一个特征向量,对于每个用户和电影,会给出预测:

表示用户j评价电影的数量,那么为了学习参数向量要怎么做呢?

这就像是线性回归,最小化参数向量,加上正则化项,如下所示:(单个用户参数的学习)

这里我们可以去掉常数:

通过这个方法可以得到对参数向量的估计值,当然,当构建推荐系统时,不仅要学习单个用户的参数,要学习所有用户的参数(个用户),可以得到公式:(保证用户整体代价最小)

为了实现最小化,推导梯度下降的更新公式如下:

注意:这里求解的参数是θk(j),是指单个用户参数的梯度下降求解。所以我们不需要考虑整体用户的公式进行求导,而是按照单个用户进行求导。

这就是如何将变量应用到线性回归中来预测不同用户对不同电影的评级,这里描述电影内容的特征量来做预测,这个特殊的算法叫做基于内容的推荐算法,接下来将介绍另一种推荐算法。

三:协同过滤---基于用户对不同电影的喜好,从而进行推荐

与上面基于内容推荐相反,如果我们拥有用户的参数,我们可以学习得出电影的特征。

这一节中将讨论用来构建推荐系统的方法,叫做协同过滤,这种算法能够自行学习要使用的特征

这里还是用上一节中的预测电影的例子,但是不知道特征量具体的值,如下图所示:

对于上面的案例来说,我们的特征都是提前告诉我们每一部电影爱情、动作成分各有多少。

但是,现实当中,我们很难去花费时间、金钱,让每个人都实际的看完每一部电影后,告诉我们各个特征的成分。而且通常我们还要知道除了这两个特征之外的其他特征,那么我们该如何得到这些特征呢??

下面,假设我们不知道特征的值是多少的情况:(不知道各个电影的成分)

现在,稍稍改变一下这个假设。假设这里采访了上述4个用户,他们告知了喜欢爱情电影的程度以及喜欢动作电影的程度,于是每个用户有了对应的

如果能从用户得到例如上述的参数值,那么理论上就能推测出每部电影的的值。

我们将这一学习问题标准化到任意特征假设用户提供了偏好的值,而我们想要学习电影i的特征向量,要做的是优化目标函数:

当然,我们不仅要学习单个电影的特征,还要学习所有电影的所有特征(个电影),可以得到公式:

总结一下协同过滤的方法:

基于内容推荐:

如果已知电影的特征量,可以根据不同电影的特征,学习参数θ,已知这些特征,就能学习出不同用户的参数θ;

协同过滤:

如果用户愿意提供这些参数θ,那么就能估计出各种电影的特征值。

那么通过上面两种方式,通过初始化的θ参数,获得x,进一步修改θ...,如下:

(鸡->蛋->鸡->蛋->鸡->蛋->...)

这样的迭代过程,会得到更好的θ和x,如果重复这个过程,算法将会收敛到一组合理的电影特征以及一组合理的对不同用户的参数估计,这就是协同过滤。

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

这一节中,探讨了最基本的协同过滤算法,它指的是当你执行算法时,要观察大量的用户的实际行为来协同地得到更佳的每个人对电影的评分值,协同的另一层含义就是每个用户都在帮助算法更好地进行特征学习。

四:协同过滤算法

将会结合前两节中讲述到的概念来设计协同过滤算法

 我们并不需要不停地重复计算,解出θ解出x再解出θ再解出x,实际上存在更有效率的算法可以将θ和x同时计算出来,定义新的优化目标函数J(将上面两个优化目标函数结合起来),如下图所示:

对于最终的平方误差项,我们需要进行了解:(两项平方误差项实质上是一样的---只是看起来有所不同)

首先对于第一部分的误差项:

两个求和表示的是对每个用户j,将所有被该用户评分过的电影误差总和---等同于就是将所有(i,j)对<被评价过的>全部加起来

对于第二项的误差项: 

表示对于每部电影i,将所有对它评分过的用户j求和

所以,上面两个都是对所有r(i,j)=1的(i,j)对进行求和,就是对所有有评分的(用户-电影)对进行求和。

所以我们最后得出的就是其中任意一个误差项求和!!!

这个代价函数将关于θ和x的两个代价函数合并起来,为了提出一个综合的优化目标问题,要做的是将这个代价函数视为特征x和用户参数θ的函数,对它的整体最小化:

最后,当我们以这种方法学习特征量时,之前我们遵守的惯例是:我们所使用的特征x_0=1对应一个截距项。当我们以这种形式去学习特征量时,我们不再遵守这一惯例,我们不将设置x_0,所以我们x向量变为n维,而不是以前的n+1维。同样的,Θ_0也不再需要!!!

我们放弃这个惯例的理由是:我们现在是在学习的所有的特征,我们没有必要将一个特征值强制设置编码为1。除非必要情况下,我们才需要进行设置(而且算法可以依靠自己去学习来获得1这个数值)。因为可以灵活自动学习所有特征,所以我们完全不需要进行干预。

所以,将上述所讲的结合起来,就得到了协同过滤算法:

1.首先会把θ和x初始化为小的随机值;

2.接下来用梯度下降或其他高级优化算法把代价函数最小化;

提醒一下:这里我们不再有x_0=1这一项,不存在θ_0,所以正则化时,我们需要对所有参数进行正则化,我们不需要像前面进行区分k是否为0的情况。

3.最后,如果用户还没有对电影进行评分,如果用户具有一些参数θ,电影带有已知的特征x,就可以预测出该用户给这部电影的评分会是:

这就是协同过滤算法,可以使用它同时计算出θ和x。

五: 矢量化-低秩矩阵分解

将介绍协同过滤算法的向量化实现和算法可以实现的一些功能:比如相似商品推荐

给定了数据如下:

nm=5表示电影数量,nu=4表示用户数量。将图中的数据写入矩阵中,会得到一个5行4列的矩阵:

矩阵中的Y(i,j)就是第j个用户给第i部电影的评分用户j给第i部电影的评分的预测由公式给出,因此,预测评分的矩阵如下所示:

给定矩阵X和矩阵Θ的定义如下:

其中X的每一行代表了一个电影的特征,X则是所有电影特征提取的集合。
其中Θ代表了用户参数向量,每一行代表了每一个用户的参数向量。

就可以用向量化的方法计算预测矩阵:,这个协同过滤算法有另一个名字叫做低秩矩阵分解。

接下来再介绍一个问题:利用已学到的属性来找到相关的电影。

假如有电影i,想要找到另一部与电影i相关的电影j,换个角度来说,如果用户正在看电影j,看完后推荐哪一部电影比较合理?

比如电影i有一个特征向量,如果找到另一个电影j特征向量的距离很小,即很小,那么就很明显表明电影j和i相似,从这个意义上来说,喜欢看电影j的人也很可能喜欢看电影i。

因此,希望通过本节的学习,能够知道如何用一个向量化的实现来计算所有用户对所有电影的评分预测值,也可以实现利用已学到的特征,找到彼此相类似的电影。

六:实施细节-均值规范化

将介绍在实现推荐算法过程中的细节:均值归一化(使得算法运行更好)

考虑这样的例子,有一个用户没有给任何电影评分,如下图所示:

现在再来看一看协同过滤算法会对这个用户做什么,假设要学习两个特征变量,学习出参数向量的值会等于0:

因为Eve没有给电影评分,所以在学习参数向量时,第一项为0,没有影响,第二项也为0,只有第三项中,与我们的参数向量有关。我们要最小化该参数向量,所以θ(5)=0。

然后预测出Eve给电影的评分,用到的是公式但是这样预测的结果都为0,显然不是我们想要的结果,接下来将用均值归一化的思想来解决这个问题。

将图中的数据写入矩阵中,得到一个5行5列的矩阵:

现在要实现均值归一化,要做是计算每个电影所得评分的均值:

观察这些均值,现在用矩阵Y的每一列减去μ得到矩阵:

现在如果使用协同过滤算法进行预测,则假设这就是从用户那得到的实际评分,把它当做数据集,用来学习参数和特征,即用这些均值归一化后的电影评分来学习。当想要进行预测时,步骤如下:

对用户j对电影i的评分预测它为:;(都是从均值归一化后数据集中学习出的参数,做预测的时候需要把减去的均值加回来)

对用户5:Eve来说,由于之前没有给电影进行评分,学习到的参数仍然会等于0,所以预测的评分为:,所以即使前一项为0,预测的结果还是为,这样的结果是有意义的。

所以,这就是均值归一化的实现(给一个平均分),它作为协同过滤算法的预处理步骤,根据不同的数据集,有时能让算法表现的更好。

posted @ 2020-05-24 23:33  山上有风景  阅读(599)  评论(0编辑  收藏  举报