前言
这一章内容还是紧接着上一章内容,在上一章我给大家介绍了异常检测系统,在这一章将给大家介绍另一个在生活中常会涉及到的推荐系统。例如当你在用淘宝购物时,有没有发现每次首页推荐的商品都是和你前几次搜索过的商品相关,这就是推荐系统根据你每次搜索的爱好,然后相应地推荐你可能喜欢的商品。在这一章,我将详细地给大家介绍这类学习系统是怎样实现的。
最后,如果有理解不对的地方,希望大家不吝赐教,谢谢!
【机器学习系列】【第十三章:异常检测】【第十五章:大规模机器学习】
第十四章 Recommender Systems(推荐系统)
14.1 把问题公式化
我们以一个电影打分的例子来向大家介绍这个问题,在看完电影后,会出现一个打分环节,我们设分数为0~5分,系统会根据你打的分,然后猜测出其他你没有看过的电影你会打的分数,根据这来推荐给你可能喜欢的其他电影。如图1所示,我们得到了这样的数据,我们用来表示用户的数目,在这里=4,我们用来表示电影的数目,在这里=5,还有r(i,j)=1表示如果用户j对电影i进行了评分,那么让r(i,j)=1,用来表示用户j对电影i打的分数(注意必须是进行了评分的,才会有,即r(i,j)=1)。我们会发现前三个电影都是爱情片,后面两个都是动作片,对于用户Alice和Bob,我们会发现他们对爱情片的评分比较高,而动作片都是0分,所以大致可以推测他们比较喜欢爱情片,所以对于他们还没有看的另外一部爱情片,我们大致可以猜测评分应该也是5分或者4分这样比较高的分数,而对于用户Carol和Dave正好相反,我们发现他们对动作片比较感兴趣,所以对于他们还没有看的那部爱情片,我们可以猜测评分应该是0分或者1分这样比较低的分,其实我们推荐系统做的就是这个工作,根据已知的数据推测未知的数据,然后相应地推荐电影给用户。
图1 电影打分的情况
14.2 基于内容推荐
在前面,大致给大家讲解了推荐系统做的一个怎样的工作,在这一节将详细地给大家讲解整个系统是如何运作的。对于图1的电影打分情况,在前面也给大家说明了,这5部电影大致分为两类电影,爱情片和动作片,我们可以用来表示每部电影的特征,比如第一部电影表示这部电影的爱情指数有0.9,动作指数为0,我们也会写成这样,同样=1,用来表示每个用户的学习系数,比如第一个用户的,假设第三部电影特征,所以对于第一个用户Alice的那部没有看过的电影估计分数为,就是这样来得到每个没有评分电影的大概分数。
下面我们把整个系统进行总结:
1.r(i,j)=1 表示用户j对电影i进行了评分
2.表示用户j对电影i打的分数(r(i,j)==1)
3.表示每个用户j的学习系数
4.表示每部电影的特征系数
对于用户j对电影i评分,我们进行预测分数为
5.来表示用户j对电影已经打分了的电影数目
所以我们的目标就是:
当学习:,
当学习:
梯度下降法更新:
(for k=0)
(for k0)
对于以上我们是根据已知每个电影的特征,再进行学习得到,如图2所示,我们有了每个电影的特征,但是关于每部电影的特征指数,我们需要通过大量用户的评价才能得到,而且可能每个的人感受不同,所以这个电影的特征值不是很好确定的,所以如果我们不知道每部电影的特征指数,而我们有每个用户的学习参数,假设我们得到了,所以我们会有,由此我们可以得到第一部电影的x1=1.0,x2=0.0,所以,这样在给定时,当我们去学习时,我们的目标是,当我们学习时,我们的目标是,所以整个过程就成了当给定时,我们可以学习到x,又可以通过x学习到新的,这样反复下去,可以得到最后的和x。
图2 关于每部电影的特征指数
14.3 协同过滤算法
在前面也给大家介绍了,怎样根据学习得到x,怎样根据x学习得到,他们的目标函数分别是:和,那么我们可不可以将两者合为一了?当然是可以的,最终的结果是:,这样就不用反复去计算和x了,这也是我们要讲的协同过滤算法的核心。
下面就给大家总结下协同过滤算法的整个过程:
1.初始化和为很小的随机数,这个和之前神经网络中初始化权重因素一样。
2.最小化使用梯度下降法,对于每一个j=1,2,...,,i=1,2,...,更新,
3.用来进行预测分数。
14.4 向量化:低秩矩阵分解
对于图1的数据,我们可以用一个矩阵来表示,预测对应的每一个值我们也用一个矩阵表示,而我们的,,这就是低秩分解,大家不懂的也可以不用理解,对于线性代数比较好的可以了解下。
在前面也给大家提到过,推荐系统可以根据你的爱好推荐给你电影,那么怎样找到相关的电影了?对于每一部电影i,我们都需要通过学习去得到它的特征,然后通过计算,当两者最小时,即找到了和电影i相似的电影j。
14.5 细节的落实:均值归一化
对于前面我们给出了数据矩阵Y,有时候会出现一种情况就是对于这5部电影,有的用户一部都没有看过,假设用户Eve一部电影也没看过,则,对于,前面一项没啥影响,而最后一项就是(n=2),所以使式子结果最小会得到,我们根据,就会得到最初的评分都为0,后面再更新时就会使得每个评分总是相等的,这就不符合我们想要的结果,所以我们对此进行的改进就是先得到每部电影的均值,然后再进行预测时通过,这样对于用户Eve,我们初始化得到的数据就是,这样再更新时就会避免发生那个问题了,这就是均值归一化。