由于最近复习最优化考试,为了防止考完即忘,这里做个笔记用于备忘,本文讲解一下无约束优化问题中的最速下降法。

一、解决的问题

最速梯度下降法解决的问题是无约束优化问题,而所谓的无约束优化问题就是对目标函数的求解,没有任何的约束限制的优化问题,比如求下方最小值:

其中的函数

.

求解这类的问题可以分为两大类:一个是最优条件法和迭代法。

最优条件法是是指当函数存在解析形式,能够通过最优性条件求解出显式最优解。对于无约束最优化问题,如果f(x)在最优点x*附近可微,那么x*是局部极小点的必要条件为:

我们常常就是通过这个必要条件去求取可能的极小值点,再验证这些点是否真的是极小值点。当上式方程可以求解的时候,无约束最优化问题基本就解决了。

实际中,这个方程往往难以求解。这就引出了第二大类方法:迭代法。

今天我们来看一种迭代法,最速梯度下降法!

二、最速梯度下降法

下面先给出最速梯度下降法的计算步骤:

由以上计算步骤可知,最速下降法迭代终止时,求得的是目标函数驻点的一个近似点。

其中确定最优步长

的方法如下:

三、最速梯度下降法直观理解

在上面给出了最速梯度下降法的计算步骤,这里给出它的一些直观理解。

第一步:

第一步就是迭代法的初始点选择。

第二步:

可能有童鞋问这里的第二步的迭代终止条件为什么是

?

这是因为根据下面这个定理:

也就是说,我们最终如果到达了局部最优解的话,求出来的梯度值是为0的,也就是说该点梯度为0是该点是局部最优解的必要条件。

所以我们的终止条件就是到达某处的梯度为0,在一些条件不是太苛刻的情况下,我们也可以不让它严格为0,只是逼近于0即可。这就是第二步的解释。

第三步:

这步在是在选取迭代方向,也就是从当前点迭代的方向。这里选取当前点的梯度负方向,为什么选择这个方向,是因为梯度的负方向是局部下降最快的方向,这里不详细证明,可以参考我以前的一个回答:为什么梯度反方向是函数值局部下降最快的方向?

第四步:

第四步也是非常重要的,因为在第三步我们虽然确定了迭代方向,并且知道这个方向是局部函数值下降最快的方向,但是还没有确定走的步长,如果选取的步长不合适,也是非常不可取的,下面会给出一个例子图,那么第四步的作用就是在确定迭代方向的前提上,确定在该方向上使得函数值最小的迭代步长。

下面给出迭代步长过大过小都不好的例子图:

从上图可以看出,选择一个合适的步长是非常最重要的,这直接决定我们的收敛速度。

四、最速梯度下降法实例

因此我们找到了近似最优解:

,然后将

带入

中,即可得到要求的最小值。

五、最速下降法的缺点

需要指出的是,某点的负梯度方向,通常只是在该点附近才具有这种最速下降的性质。

在一般情况下,当用最速下降法寻找极小点时,其搜索路径呈直角锯齿状(如下图),在开头 几步,目标函数下降较快;但在接近极小点时,收敛速度长久不理想了。特别适当目标函数的等值 线为比较扁平的椭圆时,收敛就更慢了。

因此,在实用中常用最速下降法和其他方法联合应用,在前期使用最速下降法,而在接近极小值点时,可改用收敛较快的其他方法。

六、最速下降法代码实现

import numpy as np

from sympy import * import math import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist # 定义符号 x1, x2, t = symbols('x1, x2, t') def func(): # 自定义一个函数 return 2 * pow(x1, 2) + pow(x2, 2) + 2 * x1 * x2 - x2 + x1 def grad(data): # 求梯度向量,data=[data1, data2] f = func() grad_vec = [diff(f, x1), diff(f, x2)] # 求偏导数,梯度向量 grad = [] for item in grad_vec: grad.append(item.subs(x1, data[0]).subs(x2, data[1])) return grad def grad_len(grad): # 梯度向量的模长 vec_len = math.sqrt(pow(grad[0], 2) + pow(grad[1], 2)) return vec_len def zhudian(f): # 求得min(t)的驻点 t_diff = diff(f) t_min = solve(t_diff) return t_min def main(X0, theta): f = func() grad_vec = grad(X0) grad_length = grad_len(grad_vec) # 梯度向量的模长 k = 0 data_x = [0] data_y = [0] while grad_length > theta: # 迭代的终止条件 k += 1 p = -np.array(grad_vec) # 迭代 X = np.array(X0) + t * p t_func = f.subs(x1, X[0]).subs(x2, X[1]) t_min = zhudian(t_func) X0 = np.array(X0) + t_min * p grad_vec = grad(X0) grad_length = grad_len(grad_vec) print('grad_length', grad_length) print('坐标', X0[0], X0[1]) data_x.append(X0[0]) data_y.append(X0[1]) print(k) # 绘图 fig = plt.figure

最速梯度下降法及matlab实践,最速下降法以及代码实现相关推荐

  1. 梯度下降法的matlab实现

    NOTE:这是本人在学习NG课程后,尝试练习的用matlab实现的梯度下降算法.具体的梯度下降法的知识点不在赘述. 请参考线性回归 梯度下降知识点 一.线性回归(Linear Regression) ...

  2. LASSO近端梯度下降法Proximal Gradient Descent公式推导及代码

    文章目录 LASSO by Proximal Gradient Descent Proximal Gradient Descent Framework近端梯度下降算法框架 Proximal Gradi ...

  3. 随机梯度下降C语言,梯度下降法Gradient descent(最速下降法Steepest Descent)

    easyui 中datagrid 点击行的事件 $('#datagrid 的ID').datagrid({                onClickRow:function(index,data) ...

  4. 梯度下降法、最速下降法

    梯度下降法 最优化问题是求解函数极值的问题,包括极大值和极小值.相信所有的读者对这个问题都不陌生,在初中时我们就学会了求解二次函数的极值(抛物线的顶点),高中时学习了幂函数,指数函数,对数函数,三角函 ...

  5. 梯度下降法,牛顿法,高斯-牛顿迭代法,附代码实现

    ---------------------梯度下降法------------------- 梯度的一般解释: f(x)在x0的梯度:就是f(x)变化最快的方向.梯度下降法是一个最优化算法,通常也称为最 ...

  6. 最优化方法:梯度下降法、SGD

    前言: 机器学习从目标函数到模型构建到特征提取,需要模型依据目标函数约束,根据回归方式进行调整数学模型,最基本最常用的一种方法是梯度下降法,以梯度下降为指导准则,优化目标函数到最优解.  原文地址:再 ...

  7. python迭代算法_Python实现简单的梯度下降法

    Python 实现简单的梯度下降法 机器学习算法常常可以归结为求解一个最优化问题,而梯度下降法就是求解最优化问题的一个方法. 梯度下降法(gradient descent)或最速下降法(steepes ...

  8. 机器学习中的数学原理——随机梯度下降法

    这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言!这一篇就更新一下<白话机器学习中的数学--随机梯度下降法>! ...

  9. 梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

    http://ihoge.cn/2018/GradientDescent.html http://ihoge.cn/2018/newton1.html 引言 李航老师在<统计学习方法>中将 ...

  10. 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现

    回归:在这类任务中,计算机程序需要对给定输入预测数值.为了解决这个任务,学习算法需要输出函数f:Rn→R.除了返回结果的形式不一样外,这类问题和分类问题是很像的.这类任务的一个示例是预测投保人的索赔金 ...

最新文章

  1. (C++)1020 月饼 简单贪心
  2. TestStack.White安装详解
  3. 关于数论【康托展开及其逆运算】
  4. 基于USES_CONVERSION的W2A用法之CString转char
  5. vscode 好用插件
  6. JRuby:使Java和Ruby成为一家人
  7. Visual Studio Code 10 月 Python 扩展更新
  8. python小熊代码_Android开源项目-小熊日记讲解【附源码】
  9. 道路测量xy坐标表示什么_cad里面什么叫绝对极坐标,相对极坐标,怎么区分他们?...
  10. 什么是Android Instant Apps?
  11. django按日期查询数据
  12. Keras天坑:想当然的对层的直接运算带来的问题
  13. python中复数的乘法_不一致的numpy复数乘法结果
  14. 2020年3月31日 生活思考 ~ 子贡论时
  15. 手绘视频系列目录与总结
  16. 揭秘5G,带你了解通信发展
  17. 嵌入式行业经济发展和欧盟工业发展的晴雨表,你关注了么?
  18. layui 页面的嵌套_LayUI--页面元素
  19. java 内存溢出快速定位
  20. 如何购买腾讯云服务器(详细教程指南)

热门文章

  1. win10 最新版1803 1809打不开xps文件找不到xps查看器的解决办法
  2. 电力行业巡检对讲通信系统
  3. 项目经理(甲方)推行ERP,需要做些什么?
  4. Linux学习笔记之实现黑客帝国炫酷效果
  5. rdcman汉化_Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
  6. UDP读取发送工具类
  7. 2020低压电工模拟考试系统及低压电工考试软件
  8. 2022年高压电工模拟考试及高压电工复审模拟考试
  9. tomcat安装及配置教程(保姆级)
  10. 优化算法|布谷鸟算法原理及实现