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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
介绍Python中的__future__模块
Apr 27 Python
Python编码类型转换方法详解
Jul 01 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
python requests使用socks5的例子
Jul 25 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
在django模板中实现超链接配置
Aug 21 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
基于Python的EasyGUI学习实践
May 07 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 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实现mysql数据库备份类
2008/03/20 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
简单实现python聊天程序
2018/04/01 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
写一个方法1000的阶乘
2012/11/21 面试题
大学生素质拓展活动方案
2014/02/11 职场文书
车辆工程专业求职信
2014/04/28 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
幼儿园辞职书
2015/02/26 职场文书
oracle索引总结
2021/09/25 Oracle
Elasticsearch 数据类型及管理
2022/04/19 Python