使用Python实现牛顿法求极值


Posted in Python onFebruary 10, 2020

对于一个多元函数 使用Python实现牛顿法求极值 用牛顿法求其极小值的迭代格式为

使用Python实现牛顿法求极值

其中 使用Python实现牛顿法求极值 为函数 使用Python实现牛顿法求极值 的梯度向量, 使用Python实现牛顿法求极值 为函数 使用Python实现牛顿法求极值 的Hesse(Hessian)矩阵。

上述牛顿法不是全局收敛的。为此可以引入阻尼牛顿法(又称带步长的牛顿法)。

我们知道,求极值的一般迭代格式为

使用Python实现牛顿法求极值

其中 使用Python实现牛顿法求极值 为搜索步长,使用Python实现牛顿法求极值 为搜索方向(注意所有的迭代格式都是先计算搜索方向,再计算搜索步长,如同瞎子下山一样,先找到哪个方向可行下降,再决定下几步)。

取下降方向 使用Python实现牛顿法求极值 即得阻尼牛顿法,只不过搜索步长 使用Python实现牛顿法求极值 不确定,需要用线性搜索技术确定一个较优的值,比如精确线性搜索或者Goldstein搜索、Wolfe搜索等。特别地,当 使用Python实现牛顿法求极值 一直取为常数1时,就是普通的牛顿法。

以Rosenbrock函数为例,即有

使用Python实现牛顿法求极值

于是可得函数的梯度

使用Python实现牛顿法求极值

函数使用Python实现牛顿法求极值 的Hesse矩阵为

使用Python实现牛顿法求极值

编写Python代码如下(使用版本为Python3.3):

"""
Newton法
Rosenbrock函数
函数 f(x)=100*(x(2)-x(1).^2).^2+(1-x(1)).^2
梯度 g(x)=(-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)),200*(x(2)-x(1)^2))^(T)
"""

import numpy as np
import matplotlib.pyplot as plt

def jacobian(x):
 return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])

def hessian(x):
 return np.array([[-400*(x[1]-3*x[0]**2)+2,-400*x[0]],[-400*x[0],200]])

X1=np.arange(-1.5,1.5+0.05,0.05)
X2=np.arange(-3.5,2+0.05,0.05)
[x1,x2]=np.meshgrid(X1,X2)
f=100*(x2-x1**2)**2+(1-x1)**2; # 给定的函数
plt.contour(x1,x2,f,20) # 画出函数的20条轮廓线


def newton(x0):

 print('初始点为:')
 print(x0,'\n')
 W=np.zeros((2,10**3))
 i = 1
 imax = 1000
 W[:,0] = x0 
 x = x0
 delta = 1
 alpha = 1

 while i<imax and delta>10**(-5):
  p = -np.dot(np.linalg.inv(hessian(x)),jacobian(x))
  x0 = x
  x = x + alpha*p
  W[:,i] = x
  delta = sum((x-x0)**2)
  print('第',i,'次迭代结果:')
  print(x,'\n')
  i=i+1
 W=W[:,0:i] # 记录迭代点
 return W

x0 = np.array([-1.2,1])
W=newton(x0)

plt.plot(W[0,:],W[1,:],'g*',W[0,:],W[1,:]) # 画出迭代点收敛的轨迹
plt.show()

上述代码中jacobian(x)返回函数的梯度,hessian(x)返回函数的Hesse矩阵,用W矩阵记录迭代点的坐标,然后画出点的搜索轨迹。

可得输出结果为

初始点为:
[-1.2 1. ] 

第 1 次迭代结果:
[-1.1752809 1.38067416] 

第 2 次迭代结果:
[ 0.76311487 -3.17503385] 

第 3 次迭代结果:
[ 0.76342968 0.58282478] 

第 4 次迭代结果:
[ 0.99999531 0.94402732] 

第 5 次迭代结果:
[ 0.9999957 0.99999139] 

第 6 次迭代结果:
[ 1. 1.]

即迭代了6次得到了最优解,画出的迭代点的轨迹如下:

使用Python实现牛顿法求极值

由于主要使用了Python的Numpy模块来进行计算,可以看出,代码和最终的图与Matlab是很相像的。

以上这篇使用Python实现牛顿法求极值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
使用django实现一个代码发布系统
Jul 18 Python
python3实现微型的web服务器
Sep 03 Python
python 申请内存空间,用于创建多维数组的实例
Dec 02 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
pycharm安装及如何导入numpy
Apr 03 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python 如何测试文件是否存在
Jul 31 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 #Python
TensorFlow 多元函数的极值实例
Feb 10 #Python
给 TensorFlow 变量进行赋值的方式
Feb 10 #Python
Python 中的pygame安装与配置教程详解
Feb 10 #Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 #Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 #Python
Python的pygame安装教程详解
Feb 10 #Python
You might like
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP实现添加购物车功能
2017/03/06 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
学习ExtJS table布局
2009/10/08 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
远东集团网络工程师面试题
2014/10/20 面试题
优秀小学生家长评语
2014/01/30 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
教你用python控制安卓手机
2021/05/13 Python
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers