整理自Andrew Ng的machine learning 课程 week 9.算法
目录:网络
推荐系统在机器学习领域是一个很流行的应用。机器学习
好比说,咱们尝试向用户推荐电影。咱们可使用如下定义:函数
咱们能够定义两个特征$x_1$和$x_2$,分别表明电影的浪漫程度和动做程度(值在0-1之间);学习
一个预测电影评分的作法能够是,对每个用户作linear regression,获得每一个用户的$\theta^{(j)} \in R^3$(这里自动加入了$x_0=1$),这样对用户j对电影i的评分的预测值就是$(\theta^{(j)})^Tx^{(i)}$;优化
对于用户j,电影i,预测的评分即为$(\theta^{(j)})^Tx^{(i)}$spa
为了学习参数向量$\theta^{(j)}$(用户j的参数向量),咱们做以下操做:orm
$min_{\theta^{(j)}} \quad \frac{1}{2} \sum_{i:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2}\sum_{k=1}^{n}{(\theta_k^{(j)})}^2$blog
这实际上是和线性回归的相似的损失函数同步
为了学习全部用户的参数向量:
$min_{\theta^{(1)},...,\theta^{(n_u)}} \quad \frac{1}{2} \sum_{j=1}^{n_u} \sum_{i:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n}{(\theta_k^{(j)})}^2$
以上的损失函数和线性回归中的损失函数同样,因此咱们也能够用线性回归的梯度降低法去更新参数:
$\theta_k^{(j)} = \theta_k^{(j)} - \alpha \sum_{i:r(i,j)=1} ((\theta^(j))^Tx^{(i)} - y^{(i,j)}) x_k^{(i)} \quad k=0$
$\theta_k^{(j)} = \theta_k^{(j)} - \alpha (\sum_{i:r(i,j)=1} ((\theta^(j))^Tx^{(i)} - y^{(i,j)}) x_k^{(i)} + \lambda \theta_k^{(j)}) \quad k \neq 0$
这里惟一与线性回归中的不一样就是省略掉的常数m是不同的。
实际中很难去定义和计算一部电影的浪漫度和动做度,为了解决这个问题,可使用feature finder;
能够在以前询问用户对不一样种类的电影的喜好程度,直接提供$\theta$参数;
而后就能够经过参数推算特征了:
$min_{x^{(1)},...,x^{(n_m)}} \quad \frac{1}{2} \sum_{i=1}^{n_m} \sum_{j:r(i,j)=1}{(\theta^{(j)}x^{(i)}-y^{(i,j)})}^2+\frac{\lambda}{2} \sum_{i=1}^{n_m} \sum_{k=1}^{n}{(x_k^{(i)})}^2$
你也能够随机的猜想一些$\theta$的值,而后用这些$\theta$的值去计算特征的值,这样重复的计算,最后也能够收敛到比较好的特征的值
依据上述:
这就是协同过滤(Collaborative Filtering)。
为了加快计算的速度,咱们其实能够在最小化时同步的计算参数和特征:
$J(x,\theta) = \frac{1}{2} \sum_{(i,j):r(i,j)=1} {((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})}^2 + \frac{lambda}{2} \sum_{j=1}^{n_u} \sum_{k=1}^{n}{(\theta_k^{(j)})}^2 + \frac{lambda}{2} \sum_{i=1}^{n_m} \sum_{k=1}^n {(x^{(i)})}^2$
这个式子看起来比较复杂,其实只是结合了参数$\theta$和特征x的损失函数,因为算法能够学习,因此不须要设定一个$x_0=1$,所以$x \in R^n, \theta \in R^n$;
完整算法以下:
3. 对于一个参数为$\theta$的用户和特征为x的电影,那么预测的评分为$(\theta)^Tx$
为了实现向量化的计算,公式以下:$Y=X\Theta^T$
一个m*n的矩阵的秩r若是很低,那么这个矩阵能够分解为一个m*r和一个r*n的矩阵相乘(有点相似SVD分解),因此Y能够直接分解获得X和$\Theta$
如何定义电影i和电影j的相关度?
$||x_i-x_j||$,这个值越小,说明电影i和电影j的类似度越大。
考虑一个问题,若是一个用户没有给任何一部电影评分,那么经过以前的方法计算出来的此用户对任何一部电影的评分都会是0,这显然是不对的,那么如何解决这个问题呢?
实际上,咱们能够经过Mean Normalization去处理评分矩阵,获得一个新的评分矩阵$Y’=Y-\mu$,对这个新的矩阵利用协同过滤算法,计算出用户参数矩阵和特征矩阵,再进行预测评分,此时预测时须要在结果上再加上一个均值,由于咱们的评分矩阵是通过处理的,因此求预测时,也须要再把这个以前减去的均值再加回来。