使用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加密自己的密码
Aug 04 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
python使用opencv读取图片的实例
Aug 17 Python
python代码实现ID3决策树算法
Dec 20 Python
Python生成器以及应用实例解析
Feb 08 Python
python写日志文件操作类与应用示例
Jul 01 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Python 爬虫性能相关总结
Aug 03 Python
Python3+Django get/post请求实现教程详解
Feb 16 Python
Python装饰器的练习题
Nov 23 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命名空间(Namespace)的使用详解
2013/05/04 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
对Python 数组的切片操作详解
2018/07/02 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python中time库的实例使用方法
2019/10/31 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
影视制作岗位职责
2013/12/04 职场文书
仓库管理制度
2014/01/21 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
户籍证明格式
2014/09/15 职场文书
2014年体育工作总结
2014/11/24 职场文书
结婚堵门保证书
2015/05/08 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技