【机器学习笔记】推荐系统

推荐系统

一、什么是推荐系统

学习用户的轨迹,然后推荐用户尚未用过的,但是可能喜欢的东西。

二、基于内容的推荐算法

对于一个电影网站,有若干用户对几部电影的评分,现在想要预测用户对没看过电影的评分。
那么基于内容的推荐算法,意思就是我们现在已经知道电影的特征向量,然后用来拟合用户的喜爱曲线,来预测用户评分。
【机器学习笔记】推荐系统
参数:
r(i,j)=1r(i,j)=1,表示用户ii评价过电影jj
y(i,j)y^{(i,j)},表示用户ii给电影jj的评分
Θ(j)\Theta^{(j)},表示用户 j 的向量(其中向量的分量就表示了用户对电影特征的喜欢程度)
x(i)x^{(i)},表示电影 i 的特征。
那么对于用户 j ,电影 i ,预测该用户对电影的评分为(Θ(j))T(x(i))(\Theta^{(j)})^T(x^{(i)}),也就是内积。

例如电影有两个特征:动作成分、爱情成分,则视n=2。因此x(i)x^{(i)}可以是[1, 0.99, 0]^T,第一个是偏置项。然后对于用户 j 的评分习惯来学习出参数Θ(j)\Theta^{(j)}=[0, 5, 0]^T,这说明用户对动作特征喜爱程度高达5,而对爱情特征喜爱程度为0。所以两个向量内积得到的分数5*0.99=4.95,就表示对电影的预测评分(因为该电影动作成分很高,因此预测用户很喜欢)。

m(j)m^{(j)}表示用户 j 评分过的电影数量。
因此为了学习到Θ(j)\Theta^{(j)},求一个参数使得这个loss最小(类似于线性回归)
【机器学习笔记】推荐系统
其实前面的12\frac{1}{2}应该是12m(j)\frac{1}{2m^{(j)}},但是这个不影响Θ(j)\Theta^{(j)}的值,因此去掉了。
而对于有nun_u个用户时,要对每一个用户学习一个专属的参数:
【机器学习笔记】推荐系统
第一个是对每个人的最小化Loss,第二个是最小化总体代价。

三、协同过滤

通常我们不一定知道电影的特征向量,并且可能还要其他未知特征,因此需要自动去学习到这些特征值。
【机器学习笔记】推荐系统
那么现在假设我们采访了每个用户,知道了用户对电影的喜爱程度(也就是知道了参数Θ(j)\Theta^{(j)}
【机器学习笔记】推荐系统
现在就要推断出每部电影的特征值(x0,x1,x2),其中x0=1是偏置项。

例如第一个电影,可以看到1、2用户评分很高,3、4评分很低,说明这个电影有可能是爱情电影(因为1、2用户更喜爱爱情电影,3、4用户更喜爱动作电影),因此可以大致推断x1≈1,x2≈0。那么在数学上表示为:我们需要求该电影的特征向量x(1)x^{(1)},使得
(Θ(1))T(x(1))5(\Theta^{(1)})^T(x^{(1)})≈5(Θ(2))T(x(1))5(\Theta^{(2)})^T(x^{(1)})≈5(Θ(3))T(x(1))0(\Theta^{(3)})^T(x^{(1)})≈0(Θ(4))T(x(1))0(\Theta^{(4)})^T(x^{(1)})≈0

推广一下,优化问题为:
【机器学习笔记】推荐系统
想要学习到电影特征x(i)x^{(i)},使得预测输出和实际评分尽可能接近。
学习所有电影的特征:
【机器学习笔记】推荐系统

总结:
我们现在学习到了,
1)给定电影特征x(1)x^{(1)}x(nm)x^{(n_m)},可以学习用户参数Θ(1)\Theta^{(1)}Θ(nu)\Theta^{(n_u)}
2)给定用户参数Θ(1)\Theta^{(1)}Θ(nu)\Theta^{(n_u)},可以学习电影特征x(1)x^{(1)}x(nm)x^{(n_m)}

那么可以随机初始化Θ\Theta,然后学习到xx,再更新Θ\Theta,再更新xx…直到收敛。
这就是基本的协同过滤算法

四、协同过滤算法改进

现在同时优化x(1)x^{(1)}x(nm)x^{(n_m)}Θ(1)\Theta^{(1)}Θ(nu)\Theta^{(n_u)}
【机器学习笔记】推荐系统
是将两个代价函数合并起来的。

算法过程:
1、把x(1)x^{(1)}x(nm)x^{(n_m)}Θ(1)\Theta^{(1)}Θ(nu)\Theta^{(n_u)}随机初始化为小的数值
2、使用梯度下降(或者其他优化算法),来最小化代价函数
【机器学习笔记】推荐系统
3、给一个用户的参数Θ\Theta和电影学习到的特征x,就能够预测该用户对电影的评分

五、协同过滤算法的向量化实现——低秩矩阵分解

把x和Θ\Theta按行分别写成一个大矩阵:
【机器学习笔记】推荐系统【机器学习笔记】推荐系统

然后 XΘTX\Theta^T可以得到全部预测评分的矩阵:
【机器学习笔记】推荐系统
其中第i行第j列,就表示预测用户j对电影i 的评分。

六、如何从电影i,找到相关的电影j

【机器学习笔记】推荐系统
距离表示了两部电影的相似度,距离越小,相似度就越高。

七、均值归一化

1、为什么要使用均值归一化?
假设现在来了一个新用户,他没有对任何电影评分,因此Θ\Theta会是全0,这样运行算法来预测他的预测评分也会是全0。
现在把所有用户的评分放入一个矩阵中,
【机器学习笔记】推荐系统
然后计算出每个电影的平均值,放入一个向量:
【机器学习笔记】推荐系统
【注】这里的均值是计算打过分的人,没打过分的人不计入。
此时,更新矩阵Y,每个元素去减去μ\mu
【机器学习笔记】推荐系统
这就是归一化,使得每部电影的评分总和都为0。
然后由均值归一化后的矩阵,去学习Θ(j)\Theta^{(j)}x(i)x^{(i)}
那么对于用户j,预测对电影i的评分就是:(Θ(j))T(x(i))(\Theta^{(j)})^T(x^{(i)})+μi\mu_i,要加上均值(因为之前减去均值)
那么现在,对于从来没评分过的用户:
他的Θ\Theta还是全0,但是他的预测评分就不会是全0。
【机器学习笔记】推荐系统【机器学习笔记】推荐系统
这样就避免了原来预测全0相当于没预测的尴尬。