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中使用列表生成式的教程
Apr 27 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python 对象中的数据类型
May 13 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
python实现批量按比例缩放图片效果
Mar 30 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
Python time库基本使用方法分析
Dec 13 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
Python脚本导出为exe程序的方法
Mar 25 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
fgetcvs在linux的问题
2012/01/15 PHP
PHP合并静态文件详解
2014/11/14 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
Python isinstance函数介绍
2015/04/14 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
出纳岗位职责
2013/11/09 职场文书
商务考察邀请函范文
2014/01/21 职场文书
学习方法演讲稿
2014/05/10 职场文书
倡议书格式模板
2014/05/13 职场文书
大学生村官考核材料
2014/05/23 职场文书
会计学毕业生求职信
2014/06/25 职场文书
房屋维修协议书范本
2014/09/25 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
Nginx速查手册及常见问题
2022/04/07 Servers