本文主要给大家介绍了梯度下降法及利用Python实现的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧。

梯度下降法介绍
梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最优化问题最常用的方法,它是一种迭代方法,每一步主要的操作是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向(因为在该方向上目标函数下降最快,这也是最速下降法名称的由来)。
梯度下降法特点:越接近目标值,步长越小,下降速度越慢。
直观上来看如下图所示:
这里每一个圈代表一个函数梯度,最中心表示函数极值点,每次迭代根据当前位置求得的梯度(用于确定搜索方向以及与步长共同决定前进速度)和步长找到一个新的位置,这样不断迭代最终到达目标函数局部最优点(如果目标函数是凸函数,则到达全局最优点)。
下面我们将通过公式来具体说明梯度下降法
下面这个h(θ)是我们的拟合函数
也可以用向量的形式进行表示:
下面函数是我们需要进行最优化的风险函数,其中的每一项都表示在已有的训练集上我们的拟合函数与y之间的残差,计算其平方损失函数作为我们构建的风险函数(参见最小二乘法及其Python实现)
这里我们乘上1/2是为了方便后面求偏导数时结果更加简洁,之所以能乘上1/2是因为乘上这个系数后对求解风险函数最优值没有影响。
我们的目标就是要最小化风险函数,使得我们的拟合函数能够最大程度的对目标函数y进行拟合,即:
后面的具体梯度求解都是围绕这个目标来进行。
批量梯度下降BGD
按照传统的思想,我们需要对上述风险函数中的每个求其偏导数,得到每个对应的梯度
这里表示第i个样本点的第j分量,即h(θ)中的
接下来由于我们要最小化风险函数,故按照每个参数的负梯度方向来更新每一个
这里的α表示每一步的步长
从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度!!所以,这就引入了另外一种方法,随机梯度下降。
随机梯度下降SGD
因为批量梯度下降在训练集很大的情况下迭代速度非常之慢,所以在这种情况下再使用批量梯度下降来求解风险函数的最优化问题是不具有可行性的,在此情况下,提出了——随机梯度下降
我们将上述的风险函数改写成以下形式:
其中,
称为样本点的损失函数
接下来我们对每个样本的损失函数,对每个求其偏导数,得到每个对应的梯度
然后根据每个参数的负梯度方向来更新每一个
与批量梯度下降相比,随机梯度下降每次迭代只用到了一个样本,在样本量很大的情况下,常见的情况是只用到了其中一部分样本数据即可将θ迭代到最优解。因此随机梯度下降比批量梯度下降在计算量上会大大减少。
SGD有一个缺点是,其噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。而且SGD因为每次都是使用一个样本进行迭代,因此最终求得的最优解往往不是全局最优解,而只是局部最优解。但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
下面是两种方法的图形展示:
从上述图形可以看出,SGD因为每次都是用一个样本点进行梯度搜索,因此其最优化路径看上去比较盲目(这也是随机梯度下降名字的由来)。
对比其优劣点如下:
批量梯度下降:
优点:全局最优解;易于并行实现;总体迭代次数不多
缺点:当样本数目很多时,训练过程会很慢,每次迭代需要耗费大量的时间。
随机梯度下降:
优点:训练速度快,每次迭代计算量不大
缺点:准确度下降,并不是全局最优;不易于并行实现;总体迭代次数比较多。
Python实现方法示例
上面我们讲解了什么是梯度下降法,以及如何求解梯度下降,下面我们将通过python来实现梯度下降法。
# _*_ coding: utf-8 _*_ # 作者: yhao # 博客: http://blog.csdn.net/yhao2014 # 邮箱: yanhao07@sina.com # 训练集 # 每个样本点有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.217205, 75.195834, 60.105519, 49.342380] # 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代 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.782632, theta1 : 3.207850, theta2 : 7.998823, error1 : 7.508687 theta0 : 4.254302, theta1 : 3.809652, theta2 : 11.972218, error1 : 813.550287 theta0 : 5.154766, theta1 : 3.351648, theta2 : 14.188535, error1 : 1686.507256 theta0 : 5.800348, theta1 : 2.489862, theta2 : 15.617995, error1 : 2086.492788 theta0 : 6.326710, theta1 : 1.500854, theta2 : 16.676947, error1 : 2204.562407 theta0 : 6.792409, theta1 : 0.499552, theta2 : 17.545335, error1 : 2194.779569 theta0 : 74.892395, theta1 : -13.494257, theta2 : 8.587471, error1 : 87.700881 theta0 : 74.942294, theta1 : -13.493667, theta2 : 8.571632, error1 : 87.372640 theta0 : 74.992087, theta1 : -13.493079, theta2 : 8.555828, error1 : 87.045719 theta0 : 75.041771, theta1 : -13.492491, theta2 : 8.540057, error1 : 86.720115 theta0 : 75.091349, theta1 : -13.491905, theta2 : 8.524321, error1 : 86.395820 theta0 : 75.140820, theta1 : -13.491320, theta2 : 8.508618, error1 : 86.072830 theta0 : 75.190184, theta1 : -13.490736, theta2 : 8.492950, error1 : 85.751139 theta0 : 75.239442, theta1 : -13.490154, theta2 : 8.477315, error1 : 85.430741 theta0 : 97.986390, theta1 : -13.221172, theta2 : 1.257259, error1 : 1.553781 theta0 : 97.986505, theta1 : -13.221170, theta2 : 1.257223, error1 : 1.553680 theta0 : 97.986620, theta1 : -13.221169, theta2 : 1.257186, error1 : 1.553579 theta0 : 97.986735, theta1 : -13.221167, theta2 : 1.257150, error1 : 1.553479 theta0 : 97.986849, theta1 : -13.221166, theta2 : 1.257113, error1 : 1.553379 theta0 : 97.986963, theta1 : -13.221165, theta2 : 1.257077, error1 : 1.553278 Done: theta0 : 97.987078, theta1 : -13.221163, theta2 : 1.257041 迭代次数: 3443
可以看到最后收敛到稳定的参数值。
注意:这里在选取alpha和epsilon时需要谨慎选择,可能不适的值会导致最后无法收敛。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
参考文档:
# 梯度下降法
# python
# python实现梯度下降法
# 梯度下降
# python梯度下降算法的实现
# python梯度下降法的简单示例
# 基于随机梯度下降的矩阵分解推荐算法(python)
# python实现梯度下降算法
# python+numpy+matplotalib实现梯度下降法
# python实现随机梯度下降法
# Python编程实现线性回归和批量梯度下降法代码实例
# Python语言描述随机梯度下降法
# python实现随机梯度下降(SGD)
# 迭代
# 最优
# 都是
# 最优化
# 情况下
# 乘上
# 的是
# 这也是
# 是在
# 是因为
# 相关内容
# 都要
# 在此
# 两种
# 可以用
# 不多
# 两次
# 提出了
# 它是
# 这就
相关文章:
北京的网站制作公司有哪些,哪个视频网站最好?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站之星后台密码遗忘?如何快速找回?
广州建站公司哪家好?十大优质服务商推荐
香港服务器选型指南:免备案配置与高效建站方案解析
如何挑选高效建站主机与优质域名?
C#如何序列化对象为XML XmlSerializer用法
建站主机是什么?如何选择适合的建站主机?
,购物网站怎么盈利呢?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
定制建站价位费用解析与套餐推荐全攻略
怀化网站制作公司,怀化新生儿上户网上办理流程?
建站之星安装路径如何正确选择及配置?
,如何利用word制作宣传手册?
如何挑选优质建站一级代理提升网站排名?
如何选择靠谱的建站公司加盟品牌?
如何在景安服务器上快速搭建个人网站?
如何用PHP快速搭建CMS系统?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何通过FTP空间快速搭建安全高效网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
建站之星后台密码遗忘如何找回?
建站之星展会模板:智能建站与自助搭建高效解决方案
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何在阿里云部署织梦网站?
XML的“混合内容”是什么 怎么用DTD或XSD定义
Android滚轮选择时间控件使用详解
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
济南专业网站制作公司,济南信息工程学校怎么样?
建站之星如何实现五合一智能建站与营销推广?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过cPanel快速搭建网站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
建站之星如何修改网站生成路径?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
建站之星伪静态规则如何正确配置?
如何在Windows 2008云服务器安全搭建网站?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
再谈Python中的字符串与字符编码(推荐)
临沂网站制作公司有哪些,临沂第四中学官网?
如何制作算命网站,怎么注册算命网站?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
建站上市公司网站建设方案与SEO优化服务定制指南
如何确保西部建站助手FTP传输的安全性?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
建站之星与建站宝盒如何选择最佳方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。