前言:
本文基本取自于jingyi130705008 的博客,博客原文如下, 可跳转直接看原文。
https://blog.csdn.net/jingyi130705008/article/details/79012721blog.csdn.net背景:
协同过滤(Collaboration Filtering,CF)算法是推荐系统中最常用的一种算法,这里以电影推荐为例,简要论述基本原理,最终给出实现的python代码。
1. 问题定义
假设现有一个二维表,记录着每个用户对所看电影的评分情况,如下图所示:
从图中可知,二维表记录着4个用户关于5部电影的评分情况,其中部分数据缺失,那么能否根据表格已有信息来对缺失值进行填充,实际意义就是能否根据用户喜好和电影特征来评估该用户对该电影的评分情况。因此,该问题需要解决两个小问题。一是用户喜好如何来衡量?二是电影特征如何确定?下面,我们将分别从这两个角度进行解释,一个角度是已知电影特征,优化用户喜好;另一个角度是已知用户喜好,优化电影特征。
2. 已知电影特征
假设已知每部电影具有两个特征x1、x2,其中x1表示该电影浪漫的程度,x2表示该电影搞笑的程度。如果一部电影的特征表示为(1,0),那么就认为该电影是一部爱情浪漫片;如果特征表示为(0,1),那么就认为该电影是一部喜剧片;如果表示为(0.6,0.5),那么就认为该电影是一部爱情浪漫喜剧片。
如果现在已经通过手工标记,计算出所有电影的特征数据,那么我们就可以利用这些数据来学习每个用户的喜好了。由于电影特征x是二维的,用户喜好θ也应该是二维的。如果学习到Alice的用户喜好θ为(4.5,1),而《cute puppies of love》这部电影的特征为(0.9,0),那么就可以评估Alice对《cute puppies of love》的评分为4.05。该评分在现实中是合理的,Alice的用户喜好特征表明她喜欢爱情片,《cute puppies of love》的特征表明它是一部爱情片,因此评分也就较高。下面将给出数学化描述。
对于每一个用户而言,其优化目标为:
其中θj表示第j个用户的爱好特征,xi表示第i部电影的特征,y(i,j)表示第j个用户对第i部电影的评分,i:r(i,j)=1表示第j个用户对第i部电影是评了分的(不是缺失值),mj表示第j个用户评分电影的数目。右侧那一项为正则项,是防止过拟合的(之前算法经常见到,这里不再赘述)。由于左右两项具有mj,因此上式还可以写成:
接着,利用梯度下降更新θj
最终所求θj即为第j个用户的喜好特征。
3. 已知用户喜好
如果是已知用户喜好θ,那么我们就可以学习电影的特征x了。对于每一部电影,其优化函数为
接着,利用梯度下降更新xi
最终所求xi即为第i部电影的特征。
4. 两者结合
如果现在电影特征和用户喜好特征都未知,我们可以把上面两个目标函数结合起来进行优化。如下