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通过zlib实现压缩与解压字符串的方法
Nov 19 Python
Python 文件管理实例详解
Nov 10 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
使用python编写监听端
Apr 12 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
Python单元测试unittest的具体使用示例
Dec 17 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
NumPy中的维度Axis详解
2019/11/26 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
python中Mako库实例用法
2020/12/31 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
与死神共舞观后感
2015/06/15 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
一文读懂navicat for mysql基础知识
2021/05/31 MySQL