梯度下降法及其Python实现

梯度下降法及其Python实现梯度下降法 gradientdesc 又名最速下降法 steepestdesc 是求解无约束最优化问题最常用的方法 它是一种迭代方法 每一步主要的操作是求解目标函数的梯度向量 将当前位置的负梯度方向作为搜索方向 因为在该方向上目标函数下降最快 这也是最速下降法名称的由来 梯度下降法特点 越接近目标值 步长越小 下降速度越慢 直观上来看如下图所示 这里每一个圈

梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向(因为在该方向上目标函数下降最快,这也是最速下降法名称的由来)。
梯度下降法特点:越接近目标值,步长越小,下降速度越慢。
直观上来看如下图所示:
梯度下降法及其Python实现

这里每一个圈代表一个函数梯度,最中心表示函数极值点,每次迭代根据当前位置求得的梯度(用于确定搜索方向以及与步长共同决定前进速度)和步长找到一个新的位置,这样不断迭代最终到达目标函数局部最优点(如果目标函数是凸函数,则到达全局最优点)。

下面我们将通过公式来具体说明梯度下降法
下面这个h(θ)是我们的拟合函数
梯度下降法及其Python实现

也可以用向量的形式进行表示:
梯度下降法及其Python实现

下面函数是我们需要进行最优化的风险函数,其中的每一项梯度下降法及其Python实现都表示在已有的训练集上我们的拟合函数与y之间的残差,计算其平方损失函数作为我们构建的风险函数(参见最小二乘法及其Python实现)
梯度下降法及其Python实现

这里我们乘上1/2是为了方便后面求偏导数时结果更加简洁,之所以能乘上1/2是因为乘上这个系数后对求解风险函数最优值没有影响。
我们的目标就是要最小化风险函数,使得我们的拟合函数能够最大程度的对目标函数y进行拟合,即:
梯度下降法及其Python实现

后面的具体梯度求解都是围绕这个目标来进行。

批量梯度下降BGD
按照传统的思想,我们需要对上述风险函数中的每个梯度下降法及其Python实现求其偏导数,得到每个梯度下降法及其Python实现对应的梯度
梯度下降法及其Python实现

这里梯度下降法及其Python实现表示第i个样本点梯度下降法及其Python实现的第j分量,即h(θ)中的梯度下降法及其Python实现

接下来由于我们要最小化风险函数,故按照每个参数梯度下降法及其Python实现的负梯度方向来更新每一个梯度下降法及其Python实现
梯度下降法及其Python实现

这里的α表示每一步的步长

从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度!!所以,这就引入了另外一种方法,随机梯度下降。

随机梯度下降SGD
因为批量梯度下降在训练集很大的情况下迭代速度非常之慢,所以在这种情况下再使用批量梯度下降来求解风险函数的最优化问题是不具有可行性的,在此情况下,提出了——随机梯度下降
我们将上述的风险函数改写成以下形式:
梯度下降法及其Python实现

其中,
梯度下降法及其Python实现

称为样本点梯度下降法及其Python实现的损失函数

接下来我们对每个样本的损失函数,对每个梯度下降法及其Python实现求其偏导数,得到每个梯度下降法及其Python实现对应的梯度
梯度下降法及其Python实现

然后根据每个参数梯度下降法及其Python实现的负梯度方向来更新每一个梯度下降法及其Python实现
梯度下降法及其Python实现

与批量梯度下降相比,随机梯度下降每次迭代只用到了一个样本,在样本量很大的情况下,常见的情况是只用到了其中一部分样本数据即可将θ迭代到最优解。因此随机梯度下降比批量梯度下降在计算量上会大大减少。

SGD有一个缺点是,其噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。而且SGD因为每次都是使用一个样本进行迭代,因此最终求得的最优解往往不是全局最优解,而只是局部最优解。但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。

下面是两种方法的图形展示:
梯度下降法及其Python实现
梯度下降法及其Python实现

从上述图形可以看出,SGD因为每次都是用一个样本点进行梯度搜索,因此其最优化路径看上去比较盲目(这也是随机梯度下降名字的由来)。

对比其优劣点如下:
批量梯度下降:
优点:全局最优解;易于并行实现;总体迭代次数不多
缺点:当样本数目很多时,训练过程会很慢,每次迭代需要耗费大量的时间。

随机梯度下降:
优点:训练速度快,每次迭代计算量不大
缺点:准确度下降,并不是全局最优;不易于并行实现;总体迭代次数比较多。
















































































============ 分割分割 =============
上面我们讲解了什么是梯度下降法,以及如何求解梯度下降,下面我们将通过Python来实现梯度下降法。



# _*_ coding: utf-8 _*_ # 作者: yhao # 博客: http://blog.csdn.net/yhao2014 # 邮箱:  # 训练集 # 每个样本点有3个分量 (x0,x1,x2) x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)] # y[i] 样本点对应的输出 y = [95.364, 97., 75., 60., 49.] # 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代 epsilon = 0.0001 # 学习率 alpha = 0.01 diff = [0, 0] max_itor = 1000 error1 = 0 error0 = 0 cnt = 0 m = len(x) # 初始化参数 theta0 = 0 theta1 = 0 theta2 = 0 while True: cnt += 1 # 参数迭代计算 for i in range(m): # 拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2] # 计算残差 diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i] # 梯度 = diff[0] * x[i][j] theta0 -= alpha * diff[0] * x[i][0] theta1 -= alpha * diff[0] * x[i][1] theta2 -= alpha * diff[0] * x[i][2] # 计算损失函数 error1 = 0 for lp in range(len(x)): error1 += (y[lp]-(theta0 + theta1 * x[lp][1] + theta2 * x[lp][2]))2/2 if abs(error1-error0) < epsilon: break else: error0 = error1 print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f' % (theta0, theta1, theta2, error1) print 'Done: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2) print '迭代次数: %d' % cnt 

结果(截取部分):

 theta0 : 2., theta1 : 3., theta2 : 7., error1 : 7. theta0 : 4., theta1 : 3., theta2 : 11., error1 : 813. theta0 : 5., theta1 : 3., theta2 : 14., error1 : 1686. theta0 : 5., theta1 : 2., theta2 : 15., error1 : 2086. theta0 : 6., theta1 : 1., theta2 : 16., error1 : 2204. theta0 : 6., theta1 : 0., theta2 : 17., error1 : 2194. theta0 : 74., theta1 : -13., theta2 : 8., error1 : 87. theta0 : 74., theta1 : -13., theta2 : 8., error1 : 87. theta0 : 74., theta1 : -13., theta2 : 8., error1 : 87.045719 theta0 : 75.041771, theta1 : -13., theta2 : 8., error1 : 86. theta0 : 75.091349, theta1 : -13., theta2 : 8., error1 : 86. theta0 : 75., theta1 : -13., theta2 : 8., error1 : 86.072830 theta0 : 75., theta1 : -13., theta2 : 8., error1 : 85. theta0 : 75., theta1 : -13., theta2 : 8., error1 : 85. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. theta0 : 97., theta1 : -13., theta2 : 1., error1 : 1. Done: theta0 : 97., theta1 : -13., theta2 : 1. 迭代次数: 3443

可以看到最后收敛到稳定的参数值。

注意:这里在选取alphaepsilon时需要谨慎选择,可能不适的值会导致最后无法收敛。



参考文档:

随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比

随机梯度下降法 
python实现梯度下降算法 





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows下面安装Python和pip终极教程「建议收藏」

    windows下面安装Python和pip终极教程「建议收藏」在大二的时候接触过一段时间的Python,最近又开始玩起了这门语言。总的来说,个人很喜欢Python的语言风格,但是这门语言对于windows并不算很友好,因为如果是初学者在windows环境下安装,

    2022年7月5日
    20
  • 安装VMware Tools选项显示灰色的正确解决办法

    安装VMware Tools选项显示灰色的正确解决办法百度了一天,重新安装了vm,在csdn逛了又逛,结合无数篇大神文章,最后自己成功琢磨出了真正能点亮灰色按钮的方法。简单实在,大神们的方法实在千秋万变,一个比一个复杂,最后只能实现成功拖拽,而复制粘贴却还是不行。首先问题如下:解决办法如下:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤;3.再重启虚拟机,灰色字即点…

    2022年5月9日
    684
  • CentOs官网下载,CentOS国内镜像下载

    CentOs官网下载,CentOS国内镜像下载进入CentOs官网下载地址:https://www.centos.org/download/往下拉,找到alternativedownloads超链接点击下载你需要的版本往下拉找到BaseDistribution,选择自己的版本,点击Tree选择CentOs的ISO镜像文件(isos目录)选择对应电脑的版本进行下载选择你需要的,一般下载DVD标准安装版就行在官网下载的时候是非常慢的,毕竟服务器在国外,所以可以使用国内镜像下载。CentOS7版本的国内下载http://mir.

    2022年6月5日
    38
  • 在线难例挖掘(OHEM)[通俗易懂]

    在线难例挖掘(OHEM)[通俗易懂]OHEM(onlinehardexampleminiing)详细解读一下OHEM的实现代码:defohem_loss(batch_size,cls_pred,cls_target,loc_pred,loc_target,smooth_l1_sigma=1.0):”””Arguments:batch_size(int):…

    2022年5月30日
    81
  • poe交换机百度百科_交换机带poe什么意思

    poe交换机百度百科_交换机带poe什么意思文章目录前言一、POE交换机与普通交换机的区别二、POE系统的组成三、POE交换机输出电压和功率四、POE系统的四种连接方法五、POE交换机供电距离六、提示1.网线2.不选非标POE3.不用假POE终端设备前言POE(PowerOverEthernet)指的是在现有的以太网Cat.5布线基础架构不作任何改动的情况下,在为一些基于IP的终端(如IP电话机、无线局域网接入点AP、网络摄像机等)传输数据信号的同时,还能为此类设备提供直流电的技术,就是支持以太网供电的交换机。提示:以下是本篇文章正

    2022年10月4日
    0
  • ajax cors跨域_jquery跨域

    ajax cors跨域_jquery跨域两种跨域方法在Javascript中跨域访问是比较常见的事情就像现在比较流行写单页应用,而单页应用在访问API的时候就会有跨域的问题要解决跨域的问题,其实也并不复杂,有两种方案可以选择Jsonp跨域Jsonp的实现原理就是:创建一个回调函数,然后在远程服务上调用这个函数并且将JSON数据形式作为参数传递,完成回调。CORS(跨域资源共享)跨源资源共享标准通过新增一系列HTTP头…

    2022年8月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号