线性回归之梯度下降法

线性回归:

假设h(x)=y,有大量样本,求h(x)是什么。

那么可以假设h(x)=\theta_{0} *x^0 +\theta _{1}*x^1+\theta _{2}*x^2+...+\theta _{n}*x^n+...因为x^0==1所以\theta_{0} *x^0可以简化为\theta_{0}

为了方便,这里先记只有\theta_{0}\theta_{1}的情况,原公式就简化为了:h(x)=\theta_{0} +\theta_{1} *x

假设实际结果为y,y=f(x)

那么,h(x)在什么情况下最接近f(x)呢?

h(x)-f(x)最接近0的情况下啦。

那大量样本(m组样本)呢?

我们给h(x)-f(x)做一个平方,保证它为正,为正了以后,就是求最小了对吧。方便很多:(h(x)-f(x))^2

然后把这些样本相加:\sum_{i}^{m}{} (h(x_{i} )-f(x_{i} ))^2这个相加后的值最小的时候,就是我们的假定函数h(x)最接近实际函数f(x)的时候。

由于方程中没有f(x),而f(x)=y,所以方程可以写为:\sum_{i}^{m}{} (h(x_{i} )-y_{i}  )^2

假设我们有m个样本,那么我们的目标就是:计算这些样本下,找到至少一个\theta_{0}\theta_{1}的值,使得在这个值下,样本所有结果得到的偏差最小。现在我们有两个方程:

\sum_{i}^{m}{} (h(x_{i} )-y_{i}  )^2
h(x)=\theta_{0} +\theta_{1} *x

我们的目标就是,找到至少一个\theta_{0}\theta_{1}的值,使得\sum_{i}^{m}{} (h(x_{i} )-y_{i}  )^2最小,这个值下得到的函数h(x)=\theta_{0} +\theta_{1} *x就是最接近真实函数的假定函数。

实际操作很简单……

h(x)=\theta_{0} +\theta_{1} *x,所以min(\theta_{0} ,\theta_{1} )=\sum_{i}^{m}{} (h(x_{i} )-y_{i}  )^2=\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )^2

假设这个min(\theta_{0} ,\theta_{1} )的平方差函数为J_{\theta} (\theta_{0} ,\theta_{1} )那么,J_{\theta} (\theta_{0} ,\theta_{1} )=1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )^2

那么当这个函数J_{\theta} (\theta_{0} ,\theta_{1} )最小的时候,就是我们得到\theta_{0} ,\theta_{1}的时候。

具体做法叫做“梯度下降”

对方程J_{\theta}=1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )^2\theta_{j}进行求导,得到:

\frac{d}{d\theta_{j} } J_{\theta} =\frac{d}{d\theta_{j} } 1/2m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )^2

\theta_{j}=\theta_{0}的时候,\frac{d}{d\theta_{0} } J_{\theta} =1/m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )

\theta_{j}=\theta_{1}的时候,\frac{d}{d\theta_{1} } J_{\theta} =1/m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )*x_{i}

(注意,求导的意思是,得到一个微小变量,所以上面的\frac{d}{d\theta_{0} } J_{\theta}\frac{d}{d\theta_{1} } J_{\theta}可以看作分别是对于\theta_{0}\theta_{1}的变化的一个变化量(方向)的预测。你也可以写为、\theta_{0}、\theta_{1},看个人习惯。)

那么,因为我们的目标是要得\theta_{0}\theta_{1}的值,这个值使得J_{\theta} (\theta_{0} ,\theta_{1} )最小。那么我们就可以随便选个起始点J_{\theta} (\theta_{0} ,\theta_{1} ),假设选取的点是J_{\theta} (0,0),你可以选J_{\theta} (3,7)J_{\theta} (6,9),无所谓。反正最终会使得\theta_{0}\theta_{1}不断改变的……

具体做法是,分别对于\theta_{0}\theta_{1}\pm \lambda,使得J_{\theta} (\theta_{0}\pm \lambda  ,\theta_{1} \pm \lambda )<J_{\theta} (\theta_{0} ,\theta_{1} )不断重复,直到再也找不到一个\lambda(或者找到的\lambda太小可以忽略不计)使得J_{\theta} (\theta_{0}\pm \lambda  ,\theta_{1} \pm \lambda )<J_{\theta} (\theta_{0} ,\theta_{1} ),那么此时的\theta_{0}\theta_{1}的值就是我们想要的。使得J_{\theta} (\theta_{0} ,\theta_{1} )最小的值。这时候得到的h(x)=\theta_{0} +\theta_{1} *x,就是我们想要的最接近目标函数的假定函数。

具体做法如下:

分别对于\theta_{0}\theta_{1},求出其\frac{d}{d\theta_{0} } J_{\theta}\frac{d}{d\theta_{1} } J_{\theta}的值,分别乘以一个参数\alpha控制下降速度。让计算机重复如下运算:

\theta_{0}=\theta_{0}-\alpha *\frac{d}{d\theta_{0} } J_{\theta}  ~→  \theta_{0}=\theta_{0}-\alpha /m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )

\theta_{1}=\theta_{1}-\alpha *\frac{d}{d\theta_{1} } J_{\theta} ~→\theta_{1}=\theta_{1}-\alpha/ m*\sum_{i}^{m}{} (\theta_{0} +\theta_{1} *x_{i} -y_{i}  )*x_{i}

控制重复的方法很多。比如可以每次计算J_{\theta} (\theta_{0} ,\theta_{1} )和上一次的J_{\theta} (\theta_{0} ,\theta_{1} )的差值(J_{\theta} (\theta_{0}\pm \lambda  ,\theta_{1} \pm \lambda )-J_{\theta} (\theta_{0} ,\theta_{1} )),如果两次得到的差值>0,也就是变化方向反了,那就控制函数改方向(改变\alpha的值,加个+号或者-号)。如果每次计算都得到的差值都很奇怪,比如一下大一下小,一下正一下负,可能是控制幅度太大,缩小\alpha的值即可。不断重复直到差值小于一个你觉得合适的极小值。方法很多,不一一枚举。

注意:梯度下降,每一次都需要用到所有样本(或者一堆样本,其它用来做测试,但是对于你用到的样本来说,每一次训练依然是用到所有样本。)来训练数据。这叫做“批量梯度下降”。编程的时候不需要用到循环语句,用矩阵相乘,或者向量相乘即可,方便很多。

转载:https://zhuanlan.zhihu.com/p/21340974

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值