梯度下降法及其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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MBUS协议_协议解析

    MBUS协议_协议解析来自于我的163博客,一篇好好的技术文章,在163上居然提示不能显示,我2014年6月25日就翻译出来了,当时很多其他博客都是直接拷贝我的文章都能在网上发布。看了许多关于MBus协议的资料,感觉说的不具体、不完整、也不系统,本人准备结合一个具体的产品实现,从理论和实现上对MBus协议做一个详细的论述,如有不当之处,欢迎讨论。1介绍MBus(MeterB…

    2022年10月16日
    0
  • 安卓drawable图片路径_安卓drawable添加图片

    安卓drawable图片路径_安卓drawable添加图片Android图片放对应的drawable文件夹

    2022年4月21日
    114
  • pycharm的scrapy框架-断点调试「建议收藏」

    pycharm的scrapy框架-断点调试「建议收藏」在文件根目录,也就是settings.py的上级目录,scrapy.cfg的同级目录,创建main.py:fromscrapy.cmdlineimportexecuteimportosimportsysif__name__==’__main__’:sys.path.append(os.path.dirname(os.path.abspath(__file__)))execute([‘scrapy’,’crawl’,’你的spider的name’])点

    2022年5月11日
    41
  • 函数指针与block[通俗易懂]

    该文章同时发布在我的简书上author:OC中block的身影到处瞥见但不知道你是否和我一样开始动手时,发现摸不到它的脾气脑袋一空,眼睛圆溜的45°逆转构她的形,会她的意依旧不见其身想到大学…书上白净的指针一节或许怕被难住,竟连老师也放了你鸽子还好有我触摸你皮肤也变得干涸风也一直狠劲的吞并打圈的眼眶我保证,定不负年华不负你.拿起C语言书,认真查看了一…

    2022年4月13日
    33
  • 游戏3d模型如何放到计算机中,三维建模技术在三维游戏中的应用

    游戏3d模型如何放到计算机中,三维建模技术在三维游戏中的应用张程怡摘要计算机图像技术及三维建模技术的不断发展,是三维游戏出现的重要原因之一。三维建模技术可以将现实中的物品和人在二维平面进行三维形态的模拟或再加工,达到将美术设计和计算机技术有机结合的效果,给人立体真实的感受。因此在三维游戏的制造过程中,三维建模技术得到了广泛应用。文章对三维建模技术的发展历程,三维建模技术在游戏中的运用原理进行了介绍,同时对于三维建模技术在三维游戏应用中仍存的问题及其发展…

    2022年5月12日
    68
  • Razor语法_range语法

    Razor语法_range语法本章通过示例来说明常见用途下的Razor语法。1.Razor中的核心转换符号是@。这个单一字符用做标记-代码的转换字符,有时也反过来用作代码-标记的转换字符。这里共有两种基本类型的转换:代码表达式和代码块。求出表达式的值,然后将值写入到响应中。@{stringrootNamespace="MyApp";}&lt;span&gt;@rootNamespace.Models&…

    2022年10月25日
    0

发表回复

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

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