天天看点

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

推荐系统

这个博客我们讨论一个有用的算法,也就是大家感兴趣的能变现的算法----推荐算法。

现在,当我们浏览网页的时候,服务器都会记录用户的行为,来分析我们的喜好并且推荐相关的信息。

举个例子吧,电影评分~~~

假设,我们运营了一家视频点播网站,就类似爱奇艺、优酷。在这种网站里面,用户会对电影、电视剧等的进行评分,

一般都是1星到 5 星的。觉得好看就给五星,觉得不好看就给 1 星之类的。而且这个评分对于这种网站而言还都挺重要

的。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

我们列出了五部电影,如上图。同时,我们有四个用户,将它们分别编号成1,2,3,4。

那么这些都是我们的数据,为了能够更好地表达我们这里的这个问题,我们需要引入一些符号。

我们的数据主要是两类:爱情片和动作片,然后两类用户,如上图。

那么推荐系统的问题定义就是,给定了这样的数据 r(i,j) 和 y(i,j),我们需要对于所有这些没有被评价的电影(上图?)

预测特定用户对于特定电影的评分可能是多少。在这个例子中,我们的样本很少——电影只有五部,用户只有四位,

而且大多数用户都对大多数电影进行了评分,不过在实际中,每个用户可能只对一小部分电影进行过评价,毕竟作为

一家视频网站,我们一定会有非常多的影片,而我们的任何一个特定的用户都只能看过其中一小部分。

所以,需要开发一个推荐系统,能够自动地帮我们把这里面的缺失值填补起来,这样我们就可以看看用户还没有看过

哪些电影,然后根据我们预测的评分来为用户进行推荐。也就是我们需要预测用户感兴趣的电影,然后把这些电影推

荐给用户。

如何开发推荐算法?

基于内容推荐

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

基于内容的推荐:

对于我们之前的数据集。要怎么预测(?)的值是多少呢?我们假设对于每一部电影,我们有关于它们的一些特征。

比如说,每个电影都有两个特征(爱情/动作)。那么,每一部电影就都可以表示成一个向量。

为了做出预测,我们可以针对每一个用户,把它对不同元素的电影的评分看作是一个独立的线性回归问题。

所以,我们就需要对每一个用户计算出它们对电影特征的喜好程度,也就是做一次线性回归,这样我们就可以了解每

一个用户对不同电影元素的喜好程度,那么对于用户没有看过的影片,我们只需要简单地计算一下电影元素及用户喜

好程度的内积就可以预测出用户对这部电影的评分。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统
[Python嗯~机器学习]---机器学习推荐系统简述推荐系统
[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

求用户电影权重参数的过程,如上图,参考监督学习。

基于内容的推荐算法,实际上跟我们已经讨论过的监督学习算法中的线性回归本质上是一样的,在这里我们同样有

特征数据,也有标注数据,也就是用户对看过电影的评分,要做的也是对于用户没有看过的电影进行评分预测。不

过这里面有一个很重要的假设,那就是我们对电影能够很好地抽取出一些能够表现用户喜好的特征元素,比如我们

例子中说的爱情元素以及动作元素。但实际上,这种电影的特征一般都很难提取。怎么办呢?

协同过滤

基于上述问题,我们来讨论一种不太需要构建特征的一种推荐算法,这种算法----”协同过滤”。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

这里是我们电影评分数据集。我们先前假设对于每部影片,都有两个特征来表示电影的爱情因素和动作因素的强度,

我们需要找人来对这些影片进行标注才能获得这些特征。当然,这样做必然会耗费很多的人力物力,也很费时间。而

且通常,我们除了想要有这两个特征,可能还会想要更多其他的特征。所以,如果靠人来对这些数据进行标注以得到

特征的话,几乎是不可能的。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

那么,我们稍微改变一下解决这个问题的思路。例如,有一个数据集,不知道它们的特征值。比如,这里的数据,我

们知道用户对于一些电影的评分,但是我们对于这些电影可能一无所知,我们不知道这些电影有多浪漫,也不知道这

些电影有多少动作成分。所以,我们这里把电影的所有特征都表上问号。

稍稍改变一下我们原先的假设,比如现在我们对用户进行了访谈,得到了用户对于爱情元素和动作元素的喜爱程度(

就是电影特征参数 θ1, θ2...)。

这样,对于每一个用户 j,我们都知道他对不同电影元素的喜好程度,这样,我们其实就可以推算出每一部电影的爱情

特征取值大约是多少,动作特征取值大约是多少,不关心电影名,只知道谁喜欢这部电影,谁不喜欢。而且我们也知道

每个人对不同特征的喜好程度,那么就可以大致推断出电影在不同特征上的强度了。所以对于x(1),x1可能就是1,x2

就是0。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统
[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

之前讨论了基于内容的推荐,刚才又讨论了如何根据用户喜好来预测电影的特征。那么我们将二者结合起来就可以得到

一个全新的算法。

这就是协同过滤的最基本的算法。

协同过滤,通俗讲就是,当我们执行这个算法的时候,我们通过一群用户得到的数据,这些用户实际上在高效地进行了

协同合作,只要用户对电影进行评分,那么他实际上就是在帮助算法更好地学习出电影的特征,经过几次对电影的评分,

那么系统也就会更加清楚用户的偏好,这样就产生了一个良性的循环,使得整个系统对用户推荐的影片越来越好,同时

也使得对用户的喜好刻画得越精确。

在没有电影特征信息及用户对电影特征喜好程度信息的情况下,怎么去自动地去学习这两组数据?

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

我们可以先随机初始化x,然后求出一个θ,然后再求x,然后再求θ,这样循环往复,迭代式地做。实际上,我们可以

有更加高效地算法,让我们不需要不断地来回迭代式地求解θ和x。而是可以同时把θ和x求出来。

简单地说,我们要做的其实就是把两个目标函数放在一起,然后同时求解x和θ。所以,我们定义了J函数,如上图。它

依然是一个代价函数,它的参数是我们的特征x以及参数θ,它本质上就是上面两个目标优化函数的和。

新定义的J,如果保持x不变,最小化θ,就是第一个式子;如果保持θ不变,求解x,就是第二个式子。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

这就是协同过滤算法。当然,在现实使用地推荐系统中,还有非常多地其他细节,而不仅仅是按照我们这种做法就可以

完全可以胜任一个商业化的推荐系统。但对于推荐而言,我们这里讨论的协同过滤是一种基础、经典的算法。它给我们

最大的启发在于,我们在应对某些问题的时候,即使在没有特征的时候也可以开展工作,我们可以利用仅有的用户对影

片的评分就估计出影片的特征以及用户对于特征的喜好程度。

低秩矩阵分解

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

如何向量化地来实现协同过滤?

我们也讨论一下,利用学习出来的电影特征,我们怎么找到跟某部电影最相似的其他电影。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统
[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

均值标准化

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

为什么要在推荐算法中使用均值标准化?

我们来考虑一个这样的例子:我们有一个用户,他没有对任何一部影片评分,那么加上我们之前的四位用户——张三、

李四、王二、麻子。我们现在增加了一个用户,刘五,他对任何一部影片都没有评过分。我么来看看在这种情况下,

协同过滤算法会对这个用户做什么?

他对每部电影的评分都是0,这似乎不太合理。

[Python嗯~机器学习]---机器学习推荐系统简述推荐系统

为了解决这种问题,均值标准化。

我们首先要做的就是,计算每一部影片的平均得分,我们把它存在一个新的向量μ中。所以,第一部影片,有两位用

户打了5分,两位打了0分,所以它的平均评分是2.5分。同样第二部电影也是2.5分,这么一直下去,最后一部的平均

分是1.25。

那么,接下来,我们会将用户的评分,全部减去对应影片的平均得分。

这样做了以后,每部电影的评分的均值就变成了0。

那么再接下来,使用这个均值标准化以后的数据来进行协同过滤,也就是我们不再使用原始的用户评分数据来学习电

影的特征和用户喜好的参数,而是用这个新的数据来学习参数θ和特征x。

本质上就是对于没有信息的用户,用平均分来推荐

协同过滤就讲完了~~~

继续阅读