协同过滤
1. 假定已知电影分为K种类型
为每个电影定义K个特征$\mathbf x^{(i)}$,$x_k^{(i)}$表示电影i有多么符合类型k。现在假设所有电影的这些特征值都已知。
同时为某用户定义K个系数$\mathbf \theta$,$\mathbf \theta^T\mathbf x^{(i)}$表示预测出的他对电影i的评分。
现在要做的是选择$\mathbf \theta$来线性拟合他对所有电影已有的评分。
这个系数$\mathbf \theta$我们可以看成是“偏好度”。对线性回归来说,数字越大表示越偏好。
2. 把上面的问题反过来,已知每个人对电影类型的偏好向量$\mathbf \theta^{(j)}$,但是不知道某个电影的类型$\mathbf{x}$。
$\mathbf (\theta^{(j)})^T\mathbf x$依然表示预测出对某个电影的评分。
那么问题就变成了选择$\mathbf x$来线性拟合所有人对这部电影的评分。
3. 一个简单的算法:先随机初始化每个电影的特征$\mathbf x^{(i)}$,然后反复调用1,2步,整个系统就会收敛到一个合适的状态。
4. 改进这个算法:我们把所有电影的特征$\mathbf x^{(i)}$和所有用户对特征的偏好$\mathbf \theta^{(j)}$作为一个整体来拟合所有已有的评分项。这个不再是一个典型的线性回归,但是依旧是采用梯度下降。同时我们可以抛弃常量项$\theta_0^{(i)}$和$x_0^{(j)}$,因为系统会自动学习出一个特征用来代替这些常量。
5. 一些结论:
(1)如果用户j未对电影i评分,我们可以用学习出来的$\mathbf (\theta^{(j)})^T\mathbf x^{(i)}$来预测这个评分
(2)$||x^{(i)}-x^{(i')}||$表示两部电影的相似度
(3)$||\theta^{(j)}-\theta^{(j')}||$表示个人偏好的相似度
6. 实际操作过程中,对于一个用户没有做过任何评分,那么从cost等式看出,最后学习出来的$\theta$将为全0。所以算法要做调整,使得在学出全0的情况下也是合理的。那么我们把每个用户对电影的评分减去所有人对这个电影的平均评分,拿这个结果(Y)去训练整个系统,训练完做预测的时候,把预测值加回对应平均值。