推荐系统
问题形式化
我们到淘宝网首页,就可以看到很多的物品推荐
微博上也有推荐一些人给你关注
现在考虑电影推荐(截图来自时光网)
我们收集了一些用户对一些电影的评价的数据
如豆瓣上有这样的评分
假设现在有4个用户,对五部电影进行过评价
评价是零颗星☆☆☆☆☆到五颗星★★★★★六个等级
nu表示用户人数,这里nu=4。nm表示电影数,这里nm=5。r(i,j)=1表示该用户j给电影i评分了。是用户j给电影i打的分数。表中打“?”表示没看过这部电影,需要预测这个用户对打多少分。
Alice会给The King'sSpeech打多少分呢?我们可以简单推敲下。前三部电影是励志电影,后两部是爱情电影。Alice给后两部零颗星,给前两部五颗星,说明她喜欢励志片。根据她给前两部电影的分数,求平均,得到她给励志电影的平均分是五颗星。所以可以推测她给The King'sSpeech也是五颗星★★★★★。
同样,Bob给The Pursuit of Happyness四点五颗星
Carol给The Pursuit of Happyness零颗星☆☆☆☆☆
Dave给The King'sSpeech☆☆☆☆☆,给Roman Holiday★★★★☆。
基于内容的推荐
上面我们推测Alice会给The King'sSpeech打★★★★★的时候说,前三部电影是励志电影,后两部是爱情电影,从Alice已打分的情况看,她偏爱励志电影。这里励志和爱情其实就是一部电影的特征。Alice偏爱励志电影,对她而言,励志这个特征的权重要高些。而我们所说的基于内容的推荐也是指提取要推荐的物品特征,根据用户的打分记录,给电影的特征不同喜好。如:
是电影的特征,
是用户对特征的喜好(即权重)。
把电影转成特征向量的形式:
Movie—>{Inspirational,Romance}
有了特征之后,要预测用户对电影的评分,需要知道用户对电影特征的喜好程度θ。和之前的machine learning一样,特征向量x0=1。Movie—>{1,Inspirational,Romance}
比如假设Alice的偏好为,第三部电影的特征是
。
所以Alice对The King'sSpeech的打分为。
注意θ的第一个分量设为0。
但是,θ我们其实不知道。所以,需要根据用户之前对电影的打分情况来获取该用户的喜好。这样就变成了求θ的问题了,这和以前说过的模型没有什么不同:
注意这里没有除以mj,因为mj是用户j打分过的电影数,这里去掉,不影响minJ的值。r(i,j)=1是说对第i部电影用户j有打分。
不过,因为推荐系统需要给每个用户推荐的都不同,所以要根据每个用户的喜好,也就是说,每个用户都有一个自己的学习模型,来求出各自的θ。nu是用户人数。
用梯度下降来求:
协同过滤(Collaborative filtering)
Movie—>{Inspirational,Romance}时,我们填了一些值在表中,那些是电影的特征值,也是我们人工指定的,如果不指定的话:
所以,我们要求出每部电影的特征值。如果有用户的喜好的话,我们很容易根据上面的分析求出每部电影的特征值。如:
然后,根据同样的目标函数求出,电影的特征值:
但是。。。 。。。这样就是,我们求用户偏好时,假设了特征值;求特征值时,又假设了用户偏好。。。
这就陷入了死循环。。。先给用户偏好求特征,还是先给特征求偏好。。。
所以,提出了协同过滤算法,从名字上分析,就知道这个算法要一起求出偏好和特征。做法就是把目标函数变成:
求这个目标函数最优解的时候,只能交替处理x和θ。
算法思路:
(1)初始化x和θ
(2)用梯度下降求minJ
(3)求出x和θ,就可以预测用户对没看过的电影的评分。
矢量化:低秩矩阵分解
电影特征矩阵:
特征矩阵包含了有关电影的重要信息,这些信息是给用户做推荐的重要依据。
比如有一部电影叫Front of the Class,会推荐给上述四个用户中的哪个?推荐系统会做的事情就是看这部电影和上面哪部最类似,用的是:
假设算出来后Front of the Class和Forrest Gump最类似。接着,再看哪些用户看了Forrest Gump,就推荐给他们。
实现细节—均值归一化
如果有一个新的用户Eve,我们之前没有她的电影评分记录的话,怎么给她推荐电影呢?
把评分数据整理成Y矩阵:
即:
对Y矩阵进行均值归一化处理
(1)先对每部电影的用户评分求平均:
(2)归一化,每个用户对每部电影的评分减去每部电影的均值
用归一化后的Y求模型
预测用户对电影的评分用:
Eve对电影的喜欢为:
这样,Eve对每部电影的评分就能求出来了。