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不带重复的全排列代码
Aug 13 Python
Python中的异常处理简明介绍
Apr 13 Python
详解Python发送邮件实例
Jan 10 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
用python做游戏的细节详解
Jun 25 Python
python处理大日志文件
Jul 23 Python
logging level级别介绍
Feb 21 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
PyQt5的相对布局管理的实现
Aug 07 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计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
python动态网页批量爬取
2016/02/14 Python
Python 文件处理注意事项总结
2017/04/10 Python
基于python log取对数详解
2018/06/08 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
想学画画?python满足你!
2020/12/24 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
计算机大学生的自我评价
2013/10/15 职场文书
小学生自我评价范文
2014/01/25 职场文书
副总经理岗位职责
2014/03/16 职场文书
拔河比赛口号
2014/06/10 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
2015年信访工作总结
2015/04/07 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
观后感开头
2015/06/19 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js