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 相关文章推荐
Python3实现发送QQ邮件功能(html)
Dec 15 Python
python爬虫获取百度首页内容教学
Dec 23 Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 Python
python ubplot使用方法解析
Jan 10 Python
python如何通过pyqt5实现进度条
Jan 20 Python
python新式类和经典类的区别实例分析
Mar 23 Python
Python面向对象实现方法总结
Aug 12 Python
python collections模块的使用
Oct 16 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
python基于openpyxl生成excel文件
Dec 23 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
javascript常用函数(1)
2015/11/04 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
python协程之动态添加任务的方法
2019/02/19 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
中学教师请假制度
2014/02/03 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
副总经理岗位职责
2015/02/02 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫