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中Django框架下的staticfiles使用简介
May 30 Python
Django中模型Model添加JSON类型字段的方法
Jun 17 Python
基于python实现微信模板消息
Dec 21 Python
Python 递归函数详解及实例
Dec 27 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
python实现excel读写数据
Mar 02 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
NumPy排序的实现
Jan 21 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
小偷PHP+Html+缓存
2006/11/25 PHP
FCKeditor添加自定义按钮
2008/03/27 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
php获取图片信息的方法详解
2015/12/10 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
Angular实现form自动布局
2016/01/28 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python实现单词拼写检查
2015/04/25 Python
python正则实现提取电话功能
2018/02/24 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
对python周期性定时器的示例详解
2019/02/19 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
八一建军节活动方案
2014/02/10 职场文书
法院个人总结
2015/03/03 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
队列队形口号
2015/12/25 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android