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将ip地址转换成整数的方法
Mar 17 Python
深入理解python中的闭包和装饰器
Jun 12 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python Queue模块详细介绍及实例
Dec 27 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python BeautifulSoup库的安装与使用
Dec 17 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类中的各种拦截器用法分析
2014/11/03 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
jQuery 浮动广告实现代码
2008/12/25 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
python django 访问静态文件出现404或500错误
2017/01/20 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
python中对数据进行各种排序的方法
2019/07/02 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
节水倡议书范文
2014/04/15 职场文书
机械工程师岗位职责
2014/06/16 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python