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

http://blog.csdn.net/u011239443/article/details/76735871

线性网络模型

Netflix在2006年给出了一个数据集
(用户id,电影id,电影评分)
让我们来预测用户未评分的电影评分分数。
我们可以讲用户id进行二分向量编码,然后同意用户的电影评分组成一个向量,即得到:

因为向量x只有一个值为1,所以模型可以变成:

而对于某一个电影的预测评分可以写作:

矩阵分解基础

损失函数为:

我们可以讲电影评分预测看作矩阵分解:

交替最小二乘法(ALS)
我们使用用户喜好特征矩阵 U(mk) 中的第i个用户的特征向量 ui ,和产品特征矩阵 V(nk) 第j个产品的特征向量 vj 来预测打分矩阵 A(mn) 中的 aij 。我们可以得出一下的矩阵分解模型的损失函数为:

C=(i,j)R[(aijuivTj)2+λ(u2i+v2j)]

有了损失函数之后,下面就开始介绍优化方法。通常的优化方法分为两种:交叉最小二乘法(alternative least squares)和随机梯度下降法(stochastic gradient descent)。Spark使用的是交叉最小二乘法(ALS)来最优化损失函数。算法的思想就是:我们先随机生成然后固定它求解,再固定求解,这样交替进行下去,直到取得最优解 min(C) 。因为每步迭代都会降低误差,并且误差是有下界的,所以 ALS 一定会收敛。但由于问题是非凸的,ALS 并不保证会收敛到全局最优解。但在实际应用中,ALS 对初始点不是很敏感,是否全局最优解造成的影响并不大。

算法的执行步骤:

  • 先随机生成一个。一般可以取0值或者全局均值。
  • 固定,即认为是已知的常量,来求解:
    C=(i,j)R[(aiju(0)ivTj)2+λ((u2i)(0)+v2j)]
    由于上式中只有 vj 一个未知变量,因此C的最优化问题转化为最小二乘问题,用最小二乘法求解 vj 的最优解:
    固定 j,j(1,2,...,n) ,则:等式两边关于为 vj 求导得:

    d(c)d(vj)
    =dd(vj)(i=1m[(aiju(0)ivTj)2+λ((u2i)(0)+v2j)])
    =i=1m[2(aiju(0)ivTj)((uTi)(0))+2λvj]
    =2i=1m[(u(0)i(uTi)(0)+λ)vjaij(uTi)(0)]

    d(c)d(vj)=0 ,可得:
    i=1m[(u(0)i(uTi)(0)+λ)vj]=i=1maij(uTi)(0)
    =>(U(0)(UT)(0)+λE)vj=aTjU(0)

    M1=U(0)(UT)(0)+λE,M2=aTjU(0) ,则 vj=M11M2
    按照上式依次计算 v1v2...vn ,从而得到 V(0)

  • 同理,用步骤2中类似的方法:
    C=(i,j)R[(aijui(vTj)(0))2+λ(u2i+(v2j)(0))]
    固定 i,i(1,2,...,m) ,则:等式两边关于为 ui 求导得:

    d(c)d(ui)
    =dd(ui)(j=1n[(aijui(vTj)(0))2+λ((u2i)+(v2j)(0))])
    =j=1n[2(aijui(vTj)(0))((vTj)(0))+2λui]
    =2j=1n[(v(0)j(vTj)(0)+λ)uiaij(vTj)(0)]

    d(c)d(ui)=0 ,可得:
    j=1n[(v(0)j(vTj)(0)+λ)ui]=j=1naij(vTj)(0)
    =>((V(0)(VT)(0)+λE)ui=aTiV(0)
    M1=V(0)(VT)(0)+λE,M2=aTiV(0) ,则 ui=M11M2
    按照上式依次计算 u1u2...un ,从而得到 U(1)

  • 循环执行步骤2、3,直到损失函数C的值收敛(或者设置一个迭代次数N,迭代执行步骤2、3,N次后停止)。这样,就得到了C最优解对应的矩阵U、V。

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

随机梯度下降

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

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

当训练集的数据时间上要早于测试集,这么一来,时间上越晚的数据应该权重越高。于是我们可以使用随机梯度下降变形——基于时间的梯度下降——在训练后期只选择时间靠后的数据。
《机器学习技法》学习笔记15——矩阵分解_第1张图片

你可能感兴趣的:(机器学习,机器学习技法与实战)