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数组的处理代码
Jan 04 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
对Python中plt的画图函数详解
Nov 07 Python
Python中psutil的介绍与用法
May 02 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
python如何统计代码运行的时长
Jul 24 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
python实现XML解析的方法解析
Nov 16 Python
Python StringIO如何在内存中读写str
Jan 07 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
JavaScript的目的分析
2007/01/05 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python中的自省(反射)详解
2015/06/02 Python
python+django快速实现文件上传
2016/10/24 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Django REST framework内置路由用法
2019/07/26 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
毕业生自荐信
2013/12/14 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
中学教师师德承诺书
2014/05/23 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python