前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《机器学习技法》学习笔记15——矩阵分解

《机器学习技法》学习笔记15——矩阵分解

作者头像
小爷毛毛_卓寿杰
发布2019-02-13 11:36:35
4140
发布2019-02-13 11:36:35
举报
文章被收录于专栏:Soul Joy HubSoul Joy Hub

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 对初始点不是很敏感,是否全局最优解造成的影响并不大。 算法的执行步骤:

  • 先随机生成一个。一般可以取0值或者全局均值。
  • 固定,即认为是已知的常量,来求解: C=∑(i,j)∈R[(aij−u(0)ivTj)2+λ((u2i)(0)+v2j)]\large C = \sum\limits_{(i,j)\in R}[(a_{ij} - u_i^{(0)}v_j^T)^2+\lambda((u_i^2)^{(0)}+v_j^2)] 由于上式中只有vjv_j一个未知变量,因此C的最优化问题转化为最小二乘问题,用最小二乘法求解vjv_j的最优解: 固定j,j∈(1,2,...,n) j , j\in (1,2,...,n),则:等式两边关于为vjv_j求导得: d(c)d(vj)\large \frac{d(c)}{d(v_j)} =dd(vj)(∑i=1m[(aij−u(0)ivTj)2+λ((u2i)(0)+v2j)])\large= \frac{d}{d(v_j)}(\sum\limits_{i=1}^{m}[(a_{ij} - u_i^{(0)}v_j^T)^2+\lambda((u_i^2)^{(0)}+v_j^2)]) =∑i=1m[2(aij−u(0)ivTj)(−(uTi)(0))+2λvj]\large= \sum\limits_{i=1}^m[2(a_{ij} - u_i^{(0)}v_j^T)(- (u_i^T)^{(0)})+2\lambda v_j] =2∑i=1m[(u(0)i(uTi)(0)+λ)vj−aij(uTi)(0)]\large= 2\sum\limits_{i=1}^m[( u_i^{(0)}(u_i^T)^{(0)}+\lambda)v_j-a_{ij}(u_i^T)^{(0)}] 令d(c)d(vj)=0\large \frac{d(c)}{d(v_j)} =0,可得: ∑i=1m[(u(0)i(uTi)(0)+λ)vj]=∑i=1maij(uTi)(0)\large\sum\limits_{i=1}^m[( u_i^{(0)}(u_i^T)^{(0)}+\lambda)v_j]=\sum\limits_{i=1}^m a_{ij}(u_i^T)^{(0)} =>(U(0)(UT)(0)+λE)vj=aTjU(0)\large => (U^{(0)}(U^T)^{(0)} + \lambda E)v_j = a_j^TU^{(0)} 令 M1=U(0)(UT)(0)+λE,M2=aTjU(0)M_1 = U^{(0)}(U^T)^{(0)} + \lambda E , M_2 = a_j^TU^{(0)},则vj=M−11M2v_j = M_1^{-1}M_2 按照上式依次计算v1,v2,...,vnv_1,v_2,...,v_n,从而得到V(0)V^{(0)}
  • 同理,用步骤2中类似的方法: C=∑(i,j)∈R[(aij−ui(vTj)(0))2+λ(u2i+(v2j)(0))]\large C = \sum\limits_{(i,j)\in R}[(a_{ij} - u_i(v_j^T)^{(0)})^2+\lambda(u_i^2+(v_j^2)^{(0)})] 固定i,i∈(1,2,...,m) i , i\in (1,2,...,m),则:等式两边关于为uiu_i求导得: d(c)d(ui)\large \frac{d(c)}{d(u_i)} =dd(ui)(∑j=1n[(aij−ui(vTj)(0))2+λ((u2i)+(v2j)(0))])\large= \frac{d}{d(u_i)}(\sum\limits_{j=1}^{n}[(a_{ij} - u_i(v_j^T)^{(0)})^2+\lambda((u_i^2)+(v_j^2)^{(0)})]) =∑j=1n[2(aij−ui(vTj)(0))(−(vTj)(0))+2λui]\large= \sum\limits_{j=1}^n[2(a_{ij} - u_i(v_j^T)^{(0)})(- (v_j^T)^{(0)})+2\lambda u_i] =2∑j=1n[(v(0)j(vTj)(0)+λ)ui−aij(vTj)(0)]\large= 2\sum\limits_{j=1}^n[( v_j^{(0)}(v_j^T)^{(0)}+\lambda)u_i-a_{ij}(v_j^T)^{(0)}] 令d(c)d(ui)=0\large \frac{d(c)}{d(u_i)} =0,可得: ∑j=1n[(v(0)j(vTj)(0)+λ)ui]=∑j=1naij(vTj)(0)\large\sum\limits_{j=1}^n[( v_j^{(0)}(v_j^T)^{(0)}+\lambda)u_i]=\sum\limits_{j=1}^n a_{ij}(v_j^T)^{(0)} =>((V(0)(VT)(0)+λE)ui=aTiV(0)\large =>( (V^{(0)}(V^T)^{(0)} + \lambda E)u_i = a_i^TV^{(0)} 令 M1=V(0)(VT)(0)+λE,M2=aTiV(0)M_1 = V^{(0)}(V^T)^{(0)} + \lambda E , M_2 =a_i^TV^{(0)},则ui=M−11M2u_i = M_1^{-1}M_2 按照上式依次计算u1,u2,...,unu_1,u_2,...,u_n,从而得到U(1)U^{(1)}
  • 循环执行步骤2、3,直到损失函数C的值收敛(或者设置一个迭代次数N,迭代执行步骤2、3,N次后停止)。这样,就得到了C最优解对应的矩阵U、V。

线性自动编码器和矩阵分解对比:

随机梯度下降

我们尝试使用随机梯度下降的方法来最小化损失函数:

于是我们的优化模型就可以表示成:

当训练集的数据时间上要早于测试集,这么一来,时间上越晚的数据应该权重越高。于是我们可以使用随机梯度下降变形——基于时间的梯度下降——在训练后期只选择时间靠后的数据。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年08月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线性网络模型
  • 矩阵分解基础
  • 随机梯度下降
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档