使用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数据分析之获取双色球历史信息的方法示例
Feb 03 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
python多进程提取处理大量文本的关键词方法
Jun 05 Python
python 以16进制打印输出的方法
Jul 09 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
实时获取Python的print输出流方法
Jan 07 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python UIAutomator2使用超详细教程
Feb 19 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使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
爬虫利器Puppeteer实战
2019/01/09 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python列表操作实例
2015/01/14 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python实现随机漫步功能
2018/07/09 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
基于python实现对文件进行切分行
2020/04/26 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
python时间time模块处理大全
2020/10/25 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
毕业自我鉴定书
2014/03/24 职场文书
求职信格式要求
2014/05/23 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
职工小家建设活动方案
2014/08/25 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
会议主持词开场白
2015/05/28 职场文书
实习感想范文
2015/08/10 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
windows系统搭建WEB服务器详细教程
2022/08/05 Servers
HttpClient实现表单提交上传文件
2022/08/14 Java/Android