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中str(字符串)的使用教程
Mar 23 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
Python hashlib模块用法实例分析
Jun 12 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
2019 Python最新面试题及答案16道题
Apr 11 Python
Python类继承和多态原理解析
Feb 05 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
Python爬取豆瓣数据实现过程解析
Oct 27 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(7) php 字符串相关应用
2010/03/05 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
js 验证密码强弱的小例子
2013/03/21 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python 实现数组相减示例
2019/12/27 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
几个人围成一圈的问题
2013/09/26 面试题
自荐信范文
2013/12/10 职场文书
团组织关系介绍信
2014/01/12 职场文书
企业文化理念标语
2014/06/10 职场文书
九年级历史教学反思
2016/02/19 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技