本博客是针对Andrew Ng在Coursera上的machine learning课程的学习笔记。
基于内容的推荐(Content-based recommendation)
问题表述
假设我们有如下评分矩阵(纵向为同一用户的评分对不同电影的评分,横向为不同用户对同一部电影的评分):
即用户对电影不同特征的喜好向量的转置,与电影的特征向量相乘。
问题范式
那么,用公式化的语言来总结上述的问题,形式如下:
总结而言,我们通过以
接下来,我们将最优化目标做进一步转化:将所有需要预测的用户的损失函数加总在一起,得到我们最终的优化目标(如下图):
参数学习的方式还是用梯度下降(注意对截距项和非截距项参数的更新上,正则项是否存在的差别)
协同过滤(collaborative filtering)
问题引入
我们之前假设了已经获得了每部电影的特征向量,但实际情况中,往往电影的特征向量数据也可能没有,这种情况下,我们怎么预测用户对电影的评分呢?假设我们的每个用户已经告诉了我们他们对于不同的电影特征的喜好程度(
最优化算法
给定各用户的喜好向量
上一个部分讲的是如何通过电影的特征向量和电影评分学习到用户的喜好向量,而协同过滤是通过用户的喜好向量学习到电影的特征向量,因此这两个过程的结果可以互相为对方所用,因此可以将结果交给对方交互进行学习过程,以达到最终最优的效果。
协同过滤的最优化目标
当我们将上述的两种学习过程组合在一起,便可以同时学习用户的喜好向量和电影的特征向量,这便是我们的协同过滤算法的最优化目标:
协同过滤算法
低阶矩阵因式分解(Low Rank Matrix Factorization)。
假设我们有以下四个用户对五部电影的评分数据(有部分缺失),我们将用户的评分放入一个矩阵Y:
我们可以通过协同过滤算法获得用户对于电影的完整的评分矩阵(用拟合模型获得估计评分填入缺失部分)。而如果想通过向量化的方式直接获得这个评分矩阵,可以对X和
而这里通过
来自《集体智慧编程》的非负矩阵因式分解(Non-Negative Matrix Factorization)的参考内容,以帮助读者更好理解矩阵因式分解的知识:
对矩阵进行因式分解,其本质就是要找到两个更小的矩阵,使得二者相乘可以得到原来的矩阵,而这两个更小的矩阵分别称为特征矩阵和权重矩阵。
那么我们如何来找两部彼此相似度高的电影呢?
对于每个电影,我们可以得到它的一个特征向量
均值标准化(Mean Normalization)
同样,对于如下评分矩阵,我们用协同过滤的算法去尝试进行估计:
我们仍然将评分放入一个Y矩阵中,并可以算出每一行的一个均值,将Y的均值提取出来
然后,我们将均值标准化后的Y矩阵假设为我们从用户那边得到的真实评分矩阵,从该矩阵中学习参数