python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例


Posted in Python onApril 02, 2020

Rosenbrock函数的定义如下:

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

其函数图像如下:

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。

梯度下降

梯度下降的更新公式:

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

图中蓝色的点为起点,橙色的曲线(实际上是折线)是寻找最小值点的轨迹,终点(最小值点)为 (1,1)(1,1)。

梯度下降用了约5000次才找到最小值点。

我选择的迭代步长 α=0.002α=0.002,αα 没有办法取的太大,当为0.003时就会发生振荡:

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

牛顿法

牛顿法的更新公式:

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

Hessian矩阵中的每一个二阶偏导我是用手算算出来的。

python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

牛顿法只迭代了约5次就找到了函数的最小值点。

下面贴出两个实验的代码。

梯度下降:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker


def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2


def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])


def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])


def delta_grad(x, y):
 g = grad(x, y)

 alpha = 0.002
 delta = alpha * g
 return delta


# ----- 绘制等高线 -----
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-0.1, 1.1, n)

# 生成网格数据
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高线的颜色, 8是等高线分为几部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 绘制等高线数据
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.2],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(6000):
 delta = delta_grad(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient for Rosenbrock Function')
plt.legend()
plt.show()

牛顿法:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker


def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2


def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])


def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])


def delta_newton(x, y):
 alpha = 1.0
 delta = alpha * H(x, y).I * grad(x, y)
 return delta


# ----- 绘制等高线 -----
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-1, 1.1, n)

# 生成网格数据
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高线的颜色, 8是等高线分为几部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 绘制等高线数据
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.3],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(100):
 delta = delta_newton(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Newton\'s Method for Rosenbrock Function')
plt.legend()
plt.show()

以上这篇python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python的三目运算符和not in运算符使用示例
Mar 03 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
Python的iOS自动化打包实例代码
Nov 22 Python
对python生成业务报表的实例详解
Feb 03 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
浅析python标准库中的glob
Mar 13 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python实现取余操作的简单实例
Aug 16 Python
python 模块导入问题汇总
Feb 01 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 #Python
Python基于百度AI实现OCR文字识别
Apr 02 #Python
python 穷举指定长度的密码例子
Apr 02 #Python
python3安装OCR识别库tesserocr过程图解
Apr 02 #Python
python简单的三元一次方程求解实例
Apr 02 #Python
Python 线性回归分析以及评价指标详解
Apr 02 #Python
Django REST framwork的权限验证实例
Apr 02 #Python
You might like
PHP日期处理函数 整型日期格式
2011/01/12 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python实现的选择排序算法示例
2017/11/29 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python3 批量扫描端口的例子
2019/07/25 Python
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
党员公开承诺书2015
2015/01/21 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
员工规章制度范本
2015/08/07 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
vue+echarts实现多条折线图
2022/03/21 Vue.js
DIY胆机必读:各国电子管评价
2022/04/06 无线电