zoukankan      html  css  js  c++  java
  • 第一个机器学习算法:线性回归与梯度下降

    第一个机器学习算法:线性回归与梯度下降

    符号解释

    • (x^{(i)}),(y^{(i)}):某个训练样本
    • (m):样本总数量
    • (h_{ heta}):假设函数

    Linear regression(线性回归)

    如何获得一个线性回归模型?

    • 训练数据放入学习算法,算法通过计算得到一个假设函数
    • (x) (需要预测的数据),通过(h_ heta) (假设函数)后,得到(y) (估计值)。

    线性回归的假设函数(hypothesis)的表现形式

    [h_ heta(x)= heta_0+ heta_1x ]

    很显然这是一个一次函数,使用一次函数是为了方便学习。为了简便,我们通常简写成:

    [h(x)= heta_0+ heta_1x ]

    ( heta_0)( heta_1)这两个参数代表的意义

    学过一次函数的都知道代表的是什么。( heta_0)在这里代表的是截距,( heta_1)代表斜率。在这里我们将会不断调整截距和斜率,尽量得到一个合适的假设函数。我们需要尽量减少真实数据和假设函数的输出之间的平方差。

    平方差函数

    • 方差

      • 表达式(frac{1}{m}sumlimits_{i=1}^m(h_ heta(x^{(i)})-y^{(i)})^2)
      • 还记得距离公式吗?(x^2+y^2=d^2),因为我们是根据训练数据得出的假设函数,所以x的值其实是相同的。
      • 方差越小,说明假设函数的数据与训练数据越贴合,越贴近,假设函数就越准确。
    • 平方差函数(代价函数)

      [J( heta_0, heta_1)=frac{1}{2m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})^2 ]

      而我们的目标是:

      [mathop{minisize}limits_{ heta_0 heta_1}frac{1}{2m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})^2 ]

      就是希望找到一对( heta_0 heta_1)使得方差函数是最小的。

    Gradient descent 梯度下降

    在上面我们明确了我们的目标:

    [mathop{minisize}limits_{ heta_0 heta_1}frac{1}{2m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})^2 ]

    我们需要一种高效的方法,去寻找方差最小时的解。

    梯度下降的形象描述

    想像一下你在一座大山上,在梯度下降算法中我们要做的就是旋转360度,看看我们的周围,并问自己我要在某个方向上用小碎步尽快下山。如果我们站在山坡上的这一点,你看一下周围你会发现最佳的下山方向,现在你在山上的新起点上 ,你再看看周围,然后再一次想想 ,我应该从什么方向迈着小碎步下山? 然后你按照自己的判断又迈出一步 ,往那个方向走了一步,然后重复上面的步骤 ,从这个新的点,你环顾四周,并决定从什么方向将会最快下山 ,然后又迈进了一小步,又是一小步,并依此类推,直到你接近局部最低点的位置。

    梯度下降的数学表达

    梯度下降是一种不断且同时更新的。我们采用一次函数来学习,因此只需要更新两个值:

    [ heta_j= heta_j-alphafrac{partial}{partial heta_j}J( heta_0, heta_1) ]

    其中(alpha)是成长速率,就是每一次更新的步长。

    其中要注意的是,( heta)是先计算出来再赋值。也就是说,所有( heta)的更新不会因为别的( heta)先更新了而被影响。

    (alpha)的大小对梯度下降的影响

    • (alpha)太小,会导致更新迭代速率慢,要很久才能找局部最优解。
    • (alpha)太大,会导致无法靠近代价函数的底部,会导致算法是往上走而不是往下走。

    因此,(alpha)要控制好大小,但是直观点看是宁愿偏小也不要过大。

    为什么梯度下降找到的是局部最优解而不是全局最优解

    • 代价函数不一定是只有一个谷底的,可能有几个谷底。

    • 如果只有一个谷底,那么梯度下降找到的一定是全局最优解。

    • 而不止一个谷底的时候,我们观察一下表达式:

      [ heta_j= heta_j-alphafrac{partial}{partial heta_j}J( heta_0, heta_1) ]

      当到达某个谷谷底,但该谷底不是最优的。那么此使后面的微积分项代表的是函数的斜率,此时一定为0。那就说明,只要达到谷底,函数就会停止迭代,不会继续去寻找真正的全局最优解。

    • 因此我们可以得出一个结论:一开始选的起始点会影响最后解的结果,迭代出来的不一定是全局最优解。

    两者结合,得到第一个简单的机器学习算法

    这里是使用一次函数做例子,如果不是一次函数那推广即可。

    推导

    [J( heta_0, heta_1)=frac{1}{2m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})^2 ag{1} ]

    [ heta_j= heta_j-alphafrac{partial}{partial heta_j}J( heta_0, heta_1) ag{2} ]

    将(1)代入(2):

    [ heta_j= heta_j-alphafrac{partial}{partial heta_j}frac{1}{2m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})^2 ag{3} ]

    将1和0分别代入(frac{partial}{partial heta_j}J( heta_0, heta_1)),可得

    [j=0:frac{partial}{partial heta_0}J( heta_0, heta_1)=frac{1}{m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)}) ag{4} ]

    [j=1:frac{partial}{partial heta_0}J( heta_0, heta_1)=frac{1}{m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})·x^{(i)} ag{5} ]

    将(4),(5)代入(2),得:

    [ heta_0= heta_0-alphafrac{1}{m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)}) ]

    [ heta_1= heta_1-alphafrac{1}{m}sumlimits^m_{i=1}(h_ heta(x^{(i)})-y^{(i)})·x^{(i)} ]

    至此,我们就得到了两个参数的迭代公式。

  • 相关阅读:
    如何给发票抬头增加页签
    记录激活SAP SMTP服务过程
    反射
    乱码问题
    使用idea的常用的技巧
    解决double的值相加的问题
    代理模式之静态代理
    foreach的真面目
    记录java的面试的每一个瞬间
    变量的经典
  • 原文地址:https://www.cnblogs.com/cell-coder/p/12534786.html
Copyright © 2011-2022 走看看