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将结果保存为xlsx的方法
Jan 28 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
Python原始套接字编程实例解析
Jan 29 Python
python代码中怎么换行
Jun 17 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
Python实现数字的格式化输出
Aug 01 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
python中reload重载实例用法
Dec 15 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
Protoss建筑一览
2020/03/14 星际争霸
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
原生js调用json方法总结
2018/02/22 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
Python学习笔记之os模块使用总结
2014/11/03 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
就业推荐自我鉴定
2013/10/06 职场文书
精细化工应届生求职信
2013/11/17 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
python - timeit 时间模块
2021/04/06 Python
Python实现天气查询软件
2021/06/07 Python