1、问题的提出
假如我们拥有多个用户对一系列不同电影的打分(其中存在某用户对某电影打分缺失的情况)。如何基于这些历史数据,利用某种算法来预测用户对特定电影的打分情况?
参数表示如下:
nu—— 用户数量
nm—— 电影数量
r(i,j)——第j个用户是否对第i个电影打分(1表示打过分,0表示没打过分)
y(i,j)——第j个用户对第i个电影的打分分数
mj—— 第j个用户评过分的电影数量
比如,以下表示4个用户对5给电影的评分情况,我们需要预测?处的分数。

2、基于内容的推荐系统
假设电影有n个特征,且各个特征是已知的,用户对电影不同特征的打分权重是未知的。利用用户对不同电影的打分,可以针对每一个用户训练出一个线性回归模型。
如果,参数θ(j)=(θ(j)1,θ(j)2...θ(j)n)T表示用户j的打分权重向量,x(i)=(x(i)1,x(i)2...x(i)n)T表示电影的特征向量。那么,训练单个用户的评分模型的损失函数为:

其中,i:r(i,j)=1表示统计用户j对电影i有打分的样本。
如果训练所有用户,需要将所有用户损失函数求和,即:


3、协同过滤算法
在基于内容的推荐系统中,我们是在已知电影特征的情况下进行的。同样,如果我们在已知用户评分参数θ的情况下,可以估算电影的特征,损失函数如下:

利用梯度下降法,同时求解参数θ和x
算法步骤如下:
1)随机初始化x(1),x(2)...x(nm),θ(1),θ(2)...θ(nu)
2)梯度下降法最小化损失函数
3)训练完算法后,计算用户j对电影i的评分
协同过滤算法中,我们不包含偏执项θ0,x0
这个算法习得的特征包含了电影的重要特性,可能不容易被理解,但是可以利用这些自动习得的特征对用户的打分进行预测。
4、均值归一化
如果某个用户k对所有电影均没有评分,那么,使协同过滤损失函数最小的参数θ(k)为0。那么该用户预测的所有电影评分均为0,这显然不合理。这时,需要均值归一化。
首先对Y矩阵进行均值归一化处理,将每一个用户对每一个电影的评分减去所有用户对该电影的评分平均值,得到新的矩阵Y,然后对新矩阵Y应用协同过滤算法训练参数来预测评分,然后将平均值加回去。即将(θ(j))Tx(i)+μi作为最终的预测评分。对于没有任何评分的用户,他对每个电影的评分为各用户评分的平均值。
