使用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 相关文章推荐
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python中的sort()方法使用基础教程
Jan 08 Python
Python 12306抢火车票脚本
Feb 07 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
python3中函数参数的四种简单用法
Jul 09 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
Python实现猜拳与猜数字游戏的方法详解
Apr 06 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 面向对象的一个例子
2011/04/12 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
js css自定义分页效果
2017/02/24 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
python 用struct模块解决黏包问题
2020/11/07 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
企业优秀团员事迹材料
2014/08/20 职场文书
销售顾问工作计划书
2014/09/15 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
不同意离婚代理词
2015/05/23 职场文书
禁毒主题班会教案
2015/08/14 职场文书
《迟到》教学反思
2016/02/24 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
python使用torch随机初始化参数
2022/03/22 Python