http://blog.csdn.net/u011239443/article/details/76735871
Netflix在2006年给出了一个数据集 (用户id,电影id,电影评分) 让我们来预测用户未评分的电影评分分数。 我们可以讲用户id进行二分向量编码,然后同意用户的电影评分组成一个向量,即得到:
因为向量x只有一个值为1,所以模型可以变成:
而对于某一个电影的预测评分可以写作:
损失函数为:
我们可以讲电影评分预测看作矩阵分解:
交替最小二乘法(ALS) 我们使用用户喜好特征矩阵U(m∗k)U(m*k)中的第i个用户的特征向量uiu_i,和产品特征矩阵V(n∗k)V(n*k)第j个产品的特征向量vjv_j来预测打分矩阵A(m∗n)A(m*n)中的aija_{ij}。我们可以得出一下的矩阵分解模型的损失函数为: C=∑(i,j)∈R[(aij−uivTj)2+λ(u2i+v2j)]\large C = \sum\limits_{(i,j)\in R}[(a_{ij} - u_iv_j^T)^2+\lambda(u_i^2+v_j^2)] 有了损失函数之后,下面就开始介绍优化方法。通常的优化方法分为两种:交叉最小二乘法(alternative least squares)和随机梯度下降法(stochastic gradient descent)。Spark使用的是交叉最小二乘法(ALS)来最优化损失函数。算法的思想就是:我们先随机生成然后固定它求解,再固定求解,这样交替进行下去,直到取得最优解min(C)min(C)。因为每步迭代都会降低误差,并且误差是有下界的,所以 ALS 一定会收敛。但由于问题是非凸的,ALS 并不保证会收敛到全局最优解。但在实际应用中,ALS 对初始点不是很敏感,是否全局最优解造成的影响并不大。 算法的执行步骤:
线性自动编码器和矩阵分解对比:
我们尝试使用随机梯度下降的方法来最小化损失函数:
于是我们的优化模型就可以表示成:
当训练集的数据时间上要早于测试集,这么一来,时间上越晚的数据应该权重越高。于是我们可以使用随机梯度下降变形——基于时间的梯度下降——在训练后期只选择时间靠后的数据。