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计算回文数的方法
Mar 11 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
对python中的for循环和range内置函数详解
Apr 17 Python
用于业余项目的8个优秀Python库
Sep 21 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
python爬取指定微信公众号文章
Dec 20 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
Centos7 下安装最新的python3.8
Oct 28 Python
python groupby 函数 as_index详解
Dec 16 Python
实现Python与STM32通信方式
Dec 18 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 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实际应用经验篇(2)
2006/10/09 PHP
实用函数5
2007/11/08 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
简单谈谈python基本数据类型
2018/09/26 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
幼儿园教学随笔感言
2014/02/23 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
项目申请汇报材料
2014/08/16 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
春节慰问简报
2015/07/21 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android