zoukankan      html  css  js  c++  java
  • 梯度下降与矩阵分解实例解析

    一、SGD的一个例子说明

      下图是我目前得到的一个评分文件,3列的含义分别是UID:User ID,IID:Item ID,score:用户评分.可以看到一共有3个用户,4个物品._1

      他们可以构成一个3 * 4的评分矩阵矩阵.我现在取k=2,要把它们分解成为一个32的P矩阵和一个24的Q矩阵.

    _2

      首先初始化P和Q矩阵,一般都用符合正态分布的随机数X~N(0,1)来填充矩阵.

    _3

    _4

      现在我计算u=1时的∂L/∂Pu,取λ的值为1 首先计算u=1,i=1这个评分记录带来的梯度分量,即u=1,i=1时的temp1的值,这时_1

    然后计算u=1,i=2这个评分带来的梯度分量:temp3

    所以,u=1时的梯度为

    _1

    刚才提到的迭代公式: p_u=p_u-η ∂L/∂Pu,其中η表示学习率,就是平时我们说的梯度下降时的步长,取η=0.05 于是有P1

    可见,通过这一次对于p_1的梯度下降, p_1对应的向量从随机产生的temp5

    我们来验证一下这个变化是否是的预估的值更加准确了 原来对于R_11的估计误差为R11

    新的对于R_11的估计误差为r11_new

      确实比原来有提升.按照上述步骤分别更新所有P矩阵中的p_i,然后用更新好的P矩阵,用公式(4)中的方法更新Q,再用更新好的Q第二次更新P.这种迭代方法最终可以使得|R-PQ|的值缩小,当|R-PQ|在下一轮迭代的过程中不再变小时,我们就认为在当前的学习率η下,P,Q已经得到了局部最优解.

    二、加速梯度下降

      通过逐步减小参与计算的数据量加速(类似SPFA对贝尔曼算法的优化)

      在上面的介绍中我们可以看到整个的迭代都是矩阵Q和矩阵P不断变化,使得P*Q的结果接近R的过程。对于某些用户和物品节点而言,这些点的K维向量很快就收敛到了我们的目标值,即对于这些用户节点而言,

    temp4

      对于某些点,误差值在迭代开始没几轮的时候就达到了目标范围,这个某些点提前结束迭代的功能对于物品节点也成立.这些点可以不用参加之后的迭代。

      通过图计算可以实现,比如spark就带有这些功能。

  • 相关阅读:
    Android 使用WebView显示网页
    Android 使用ProgressBar实现进度条
    Android 使用Spinner实现下拉列表
    Android 使用GridView以表格的形式显示多张图片
    Android 使用DatePicker以及TimePicker显示当前日期和时间
    Android 使用ListView显示信息列表
    IIS配置步骤,绝对有用,百度上的不全面,是百度的补充
    冒烟测试
    广度优先和深度优先
    排序算法二(时间复杂度为O(N*logN))
  • 原文地址:https://www.cnblogs.com/hxsyl/p/5231093.html
Copyright © 2011-2022 走看看