【机器学习笔记】推荐系统
推荐系统
一、什么是推荐系统
学习用户的轨迹,然后推荐用户尚未用过的,但是可能喜欢的东西。
二、基于内容的推荐算法
对于一个电影网站,有若干用户对几部电影的评分,现在想要预测用户对没看过电影的评分。
那么基于内容的推荐算法,意思就是我们现在已经知道电影的特征向量,然后用来拟合用户的喜爱曲线,来预测用户评分。
参数:
,表示用户评价过电影
,表示用户给电影的评分
,表示用户 j 的向量(其中向量的分量就表示了用户对电影特征的喜欢程度)
,表示电影 i 的特征。
那么对于用户 j ,电影 i ,预测该用户对电影的评分为,也就是内积。
例如电影有两个特征:动作成分、爱情成分,则视n=2。因此可以是[1, 0.99, 0]^T,第一个是偏置项。然后对于用户 j 的评分习惯来学习出参数=[0, 5, 0]^T,这说明用户对动作特征喜爱程度高达5,而对爱情特征喜爱程度为0。所以两个向量内积得到的分数5*0.99=4.95,就表示对电影的预测评分(因为该电影动作成分很高,因此预测用户很喜欢)。
表示用户 j 评分过的电影数量。
因此为了学习到,求一个参数使得这个loss最小(类似于线性回归)
其实前面的应该是,但是这个不影响的值,因此去掉了。
而对于有个用户时,要对每一个用户学习一个专属的参数:
第一个是对每个人的最小化Loss,第二个是最小化总体代价。
三、协同过滤
通常我们不一定知道电影的特征向量,并且可能还要其他未知特征,因此需要自动去学习到这些特征值。
那么现在假设我们采访了每个用户,知道了用户对电影的喜爱程度(也就是知道了参数)
现在就要推断出每部电影的特征值(x0,x1,x2),其中x0=1是偏置项。
例如第一个电影,可以看到1、2用户评分很高,3、4评分很低,说明这个电影有可能是爱情电影(因为1、2用户更喜爱爱情电影,3、4用户更喜爱动作电影),因此可以大致推断x1≈1,x2≈0。那么在数学上表示为:我们需要求该电影的特征向量,使得
、、、。
推广一下,优化问题为:
想要学习到电影特征,使得预测输出和实际评分尽可能接近。
学习所有电影的特征:
总结:
我们现在学习到了,
1)给定电影特征…,可以学习用户参数…
2)给定用户参数…,可以学习电影特征…
那么可以随机初始化,然后学习到,再更新,再更新…直到收敛。
这就是基本的协同过滤算法。
四、协同过滤算法改进
现在同时优化…和…:
是将两个代价函数合并起来的。
算法过程:
1、把…和…随机初始化为小的数值
2、使用梯度下降(或者其他优化算法),来最小化代价函数
3、给一个用户的参数和电影学习到的特征x,就能够预测该用户对电影的评分
五、协同过滤算法的向量化实现——低秩矩阵分解
把x和按行分别写成一个大矩阵:
然后 可以得到全部预测评分的矩阵:
其中第i行第j列,就表示预测用户j对电影i 的评分。
六、如何从电影i,找到相关的电影j
距离表示了两部电影的相似度,距离越小,相似度就越高。
七、均值归一化
1、为什么要使用均值归一化?
假设现在来了一个新用户,他没有对任何电影评分,因此会是全0,这样运行算法来预测他的预测评分也会是全0。
现在把所有用户的评分放入一个矩阵中,
然后计算出每个电影的平均值,放入一个向量:
【注】这里的均值是计算打过分的人,没打过分的人不计入。
此时,更新矩阵Y,每个元素去减去,
这就是归一化,使得每部电影的评分总和都为0。
然后由均值归一化后的矩阵,去学习和。
那么对于用户j,预测对电影i的评分就是:+,要加上均值(因为之前减去均值)
那么现在,对于从来没评分过的用户:
他的还是全0,但是他的预测评分就不会是全0。
这样就避免了原来预测全0相当于没预测的尴尬。