python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...

Rosenbrock函数的定义如下:

4501244777d4621c024ef841a11a23ba.png

其函数图像如下:

11c4e97dfba3879c0fbb6f6d78efd3b3.png

我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。

梯度下降

梯度下降的更新公式:

ebe02a7ba9850656f780421b6f7d7f6f.png

008afe5aed1fb74e21d449748246dacb.png

图中蓝色的点为起点,橙色的曲线(实际上是折线)是寻找最小值点的轨迹,终点(最小值点)为 (1,1)(1,1)。

梯度下降用了约5000次才找到最小值点。

我选择的迭代步长 α=0.002α=0.002,αα 没有办法取的太大,当为0.003时就会发生振荡:

b78bea0eed8414eb2922d4cf55c72a3d.png

牛顿法

牛顿法的更新公式:

d1c642ab856b9750a3df3a7f06cbf9ed.png

Hessian矩阵中的每一个二阶偏导我是用手算算出来的。

d16f8de6700977bda6c21011800aae38.png

牛顿法只迭代了约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函数最小值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法

使用mysqli扩展技术查看服务器连接错误报告的方法作为PHP的黄金搭档MySQL数据库&#xff0c;在PHP项目开发过程中有着举足轻重的作用&#xff0c;这不仅因为MySQL是完全免费的&#xff0c;而且和PHP一样都是完全跨平台的。但在实际项目开发过程中&#xff0c;PHP与MySQL数据库产…

_Linux进程信号详解

信号是什么一个信号就是一条小消息&#xff0c;它通知进程系统中发生了一个某种类型的事件信号是多种多样的&#xff0c;并且一个信号对应一个事件&#xff0c;这样才能做到收到一个信号后&#xff0c;知道到底是一个什么事件&#xff0c;应该如何处理&#xff08;但是要保证必…

java乘法表_Java中四种9*9乘法表的实现方式(附代码)

前言: 初学java,实现99乘法表是必学必会的内容。需求 : 分别写出上下左右,对应四个角的乘法表。思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式。代码如下:public class Demo {public static void main(String[] args) {for (int i 1; i <5 ; i) {for (…

excel表格不够怎么添加_Excel表格水印,你以前好象添加错了!

为excel表格添加水印&#xff0c;通常是使用插入-艺术字来完成。但这样做有一个很大的问题&#xff1a;如果表格有很多页&#xff0c;就需要添加N多个艺术字&#xff0c;太麻烦了。其实有一个超简单的批量设置方法&#xff0c;再多页也可以一次性设置。需要添加水印的Excel表格…

电脑手机wifi互传文件_安卓手机文件互传

怎么不借用第三方工具&#xff0c;安卓手机实现相互文件快传呢&#xff1f;苹果&#xff1a;首先不用多说&#xff0c;苹果可以使用Air Drop功能&#xff0c;苹果全家桶可以无障碍互传。长期以来&#xff0c;除开微信和QQ&#xff0c;不同品牌安卓手机互传文件依靠的途径只有蓝…

传统的线性降维方法效果不佳。_10分钟数据降维入门

1. 前言在硕士期间学习研究了数据降维相关的知识&#xff0c;阅读了一些相关文章&#xff0c;也断断续续在知乎上写了一些数据降维的入门级文章&#xff0c;收获了一些小伙伴的赞同&#xff0c;并在GitHub上开源了一些特征抽取算法的源代码&#xff0c;获得了的1.1kstar。因为在…

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网&#xff0c;开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因&#xff1a;虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …

java ajax data_jquery ajax 方法中传递的data参数,如何在java类中获取

展开全部var params"username""1";$.ajax({type : "POST", //数据发送方式url : "../servlet/clearCache",dataType : "json", //接受数据格式 (这里有很多,常用的有html,xml,js,json)data:params,//datenew Date(), 要传递…

python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式

Python的安装、认识、配置环境变量以及helloworld打印的两种方式 一、 安装和配置环境变量 首先我们去到Python的官方下载地址根据自己的电脑机型来下载最新的python安装包&#xff0c;网址是https://www.python.org/downloads/ 。 或者点击这里跳转 。 下载之后可以去https://…

java 报表程序_java 报表

http://www.codeceo.com/article/8-java-graph.html前段时间我们为大家分享过一些最常用的Java图表应用和Android图表应用&#xff0c;无论是在PC平台上还是移动平台上&#xff0c;图表和报表功能都是不可或缺的。本文推荐了8款最精彩实用的Java图表应用&#xff0c;大部分图表…

excel跨多个表格求和_看完财务同事用Excel函数完成的进销存报表,老板惊呆了...

有仓库、有商品的地方都离不开进销存软件&#xff0c;有花钱买的、也有花大力气自已找人订制的。网上下载破解版&#xff1f;真的不可靠&#xff0c;万一出现什么问题&#xff0c;你们公司将面临信息损坏或丢失的风险&#xff01;其实&#xff0c;如果只是小规模的库存商品管理…

苹果自带相册打马赛克_如果你用苹果手机!学会这3个技巧,就能让手机变得更加好用...

如果你用苹果手机&#xff01;这3个技巧一定要学会&#xff0c;能让手机变得更好用现在手机中的黑科技功能越来越多&#xff0c;就拿iPhone手机来说&#xff0c;很多朋友选择这款手机不仅是因为拥有非常流畅的系统&#xff0c;手机中自带的黑科技功能也是大家选择它的原因。今天…

给与 x 距离不超过 d 的点权值 a_一年级不上网课,妈妈陪孩子一起来完成三单元各课练习及单元卷吧...

部编一年级下册第5课小公鸡和小鸭子课后练习题一、将下列字的音节补充完整。k____ x____ zh____ 块 行 捉 二、选择加点字的正确读音&#xff0c;画“√”。忽然(rn rnɡ)  大喊(hǎn hǎnɡ)上身(shēn sēn)  死去(sǐ shǐ)三、看拼音&#xff0c;写字词。1小明说(&am…

java games_Java Me Games

在GWT的文档里说&#xff0c;大致上CSS的命名规则是这样的"[project]-[widget]&#xff0c;比如gwt-Button&#xff0c;你可以在CSS里定义如下&#xff1a;.gwt-Button{font-size:150%;}但是这样的说明是不充分的&#xff0c;所以这里有必要把他真正的样式表来列一下&…

java timestamp 转换_Java:String和Date、Timestamp之间的转换

一、String与Date(java.util.Date)互转1.1 String -> DateJava代码 String dateStr "2010/05/04 12:34:23";Date date new Date();//注意format的格式要与日期String的格式相匹配DateFormat sdf new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");try {…

bugku 杂项 就五层你能解开吗_9.65米解放龙V杂项危险废物厢式运输车62

亲爱的,点击上方蓝字关注我吧9类危险废物厢式运输车解放龙V2.0半高顶半浮驾驶室底盘参数&#xff1a;龙V2.0半高顶半浮驾驶室、锡柴225马力&#xff0c;6.6排量&#xff0c;164千瓦&#xff0c;百公里耗油30.3L、陕齿8JS85E、435升级冲焊桥(速比4.444)、275/80R22.5-18PR层级、…

python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算

线性代数&#xff1a;矩阵基本运算在本文中&#xff0c;我们将介绍矩阵的大部分基本运算&#xff0c;依次是矩阵的加减法、矩阵的标量乘法、矩阵与矩阵的乘法、求转置矩阵&#xff0c;以及深入了解矩阵的行列式运算。本文将不会涉及逆矩阵、矩阵的秩等概念&#xff0c;将来再探…

torch tensor去掉1维_南昌清污机新价格表1_海腾水工

南昌清污机新价格表1,应用中&#xff0c;应停止机械零件&#xff0c;停止防锈处理&#xff0c;定期在停水面涂抹黄油&#xff0c;开关发生某些异常&#xff0c;立即暂停&#xff0c;及时检查。 开闭时&#xff0c;请注意活塞的上下限位置&#xff0c;以免挡板和卷扬机损坏。 起…

fx系列微型可编程控制器 通信_电气人,三菱Q系列和FX PLC系列之间的区别你都知道吗?...

三菱Q系列和FX系列作为三菱旗下的两大PLC系列&#xff0c;在日常的作业中小伙伴们都会接触到&#xff0c;因此本文将三菱可编程控制器中使用的内置的输入输出继电器、辅助继电器、状态、计数器、数据寄存器等各种软元件的作用和功能进行了说明。Q系列FX系列输入继电器 X输入继电…

left join 效率_人力资源HR的人才测评工具,极大提高招聘效率

作为一个HR小白&#xff0c;打交道最多的就是简历&#xff0c;领导谈的最多的就是提高工作效率&#xff0c;其实这个概念对于我来说还是挺抽象的&#xff0c;经过向前辈的取经&#xff0c;人力资源如何提高效率&#xff0c;做了个小小的总结。首先我们要明白我们的难点有哪些&a…