推荐系统
我们想要建立一个推荐系统,有这么两种方法:
1. 基于内容的推荐系统content-based recommendations
2. 协同过滤 collaborative filter
基于内容的推荐系统
我们想做的是我们能够根据用户以往对于电影的评分,来给用户推荐电影。
要实现上面的这个推荐系统,我们要做到两件事情:
1. 建立起一个用户对电影评分的模型
2. 根据用户评分的模型从用户没有看过的电影里面推荐合适的电影给用户
我们在建立用户对电影评分模型的时候,其实是在做两件事情:
1. 判断电影是什么类型的电影(基于内容),也就是获取样本数据
x
2. 在过去的历史中,用户对这一类型的电影给出了什么样的评价,也就是获取用户对不同类型电影的偏好,获取对每个类型评分的权重
(在我们给出的例子而言,我们的样本数据
x
已经直接给出,但是如果我们自己想要获取这样子的数据,我们应该怎么对电影的数据进行处理?)
我们先从单个用户的角度来尝试解决问题,很明显,我们可利用线性回归做预测的手段来对用户没有看过的电影做出评分预测。
我们将评分看作是
设(电影为行,用户为列)
nu
是用户的数量
nm
是电影的总数
m(j)
是第
j
个用户看的电影数量
y(i,j)
表示第
j
个用户对第
x(i)
是电影
i
的特征向量,表示第
θ(j)
是用户
j
的参数向量,表示第
那么, 用户
j
对电影
损失函数就是:
我们的optimization objective就是:
推广到多个用户的情况,我们的optimization objective 就是:
通过上式,我们利用梯度下降法就可以得到 θ(1),...,θ(nu)
至此,我们的模型就已经建立完毕。
那么,对于用户没有看过的电影,我们就可以用我们的模型去对电影进行评价,根据每一个用户对该电影的预测评分的高低来决定要不要推荐这部电影给某个用户。
但是我们基于内容的推荐系统有一个很重要的前提就是,我们能够根据内容来提取出特征,也就是获取 x 。但如果很难提取或者提取的成本太大我们要怎么办,这就要用到另外一种方法——协同过滤了。
协同过滤
协同过滤的最大一个特点就是,它可以自动地找到合适的特征!并且在升级款的协同过滤中,
我们这里提到的协同过滤有两个版本:基础款和升级款
基础款
对单部电影,给定
θ(1),...,θ(nu)
,学习参数
x(i)
:
对于所有电影而言,给定 θ(1),...,θ(nu) ,学习参数 x(1),...,x(nm)
这就是协同过滤,每一个用户在给电影打分时,都有助于算法去寻找到更有效的特征,从而给提升每一个用户的推荐体验。
和前面基于内容的推荐系统相比较,很显然
基于内容的推荐系统是
x(1),...,x(nm)
已知,估计特征
θ(1),...,θ(nu)
协同过滤是
θ(1),...,θ(nu)
已知,估计参数
x(1),...,x(nm)
也就是说我们知道了
θ
,就可以估计
x
。知道了
那么在给用户推荐时,我们就有这样子的一个流程:
随机初始化
θ
,然后求
x
,然后求好一点的
升级款
基础款的协同过滤是要不断来回折腾的,有没有什么办法能够不这么费力呢?这就引入了我们的升级款的协同过滤,能够同时调整
x
和
其中 x∈Rn,θ∈Rn
于是我们就有了以下的协同过滤算法:
1. 随机小值初始化x^{(1)},…,x^{(n_m)},\theta^{(1)},…,\theta^{(n_u)}
2. 利用梯度下降法(或其他方法),最小化损失函数
J(x(1),...,x(nm),θ(1),...,θ(nu))
∀j=1,...,nu,i=1,...,nm
3. 用户 j 对于电影
协同过滤的向量实现
Y∈Rnm×nu
预测评分结果:
其中
另外,我们将矩阵 XΘT 叫做Low Rank Matrix (Factorization)
类似产品推荐
主要以产品特征向量之间的距离 ∥x(i)−x(j)∥2 为依据,距离越小,相似度越高!
均值归一化
在进行推荐时,我们可能碰到这样子的一个情况:对于一个新的用户,他没有对任何电影进行评分,我们应该如何进行推荐?
对一个新用户来讲,他的
θ
也是由
minJ
来计算,但是因为这个用户的
r(i,j)=0
,那么
J
的第一项是没有意义的,那么
- 我们对评分矩阵
Y 的每一行取均值 μ ,也就是求每一部电影的所有评分的均值(基于看过的用户数量平均)。- 用
Y−μ
代替原来的
Y
,代入
J 进行 Θ,X 的计算。 - 预测评分: (θ(j))Tx(i)+μ
不过上面的这个步骤略繁琐了,一句话概括就是:用当前看过该电影的用户的评分均值来做为新用户对该电影的预测!
- 用
Y−μ
代替原来的
Y
,代入