使用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中readline判断文件读取结束的方法
Nov 08 Python
Python端口扫描简单程序
Nov 10 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
Python操作Jira库常用方法解析
Apr 10 Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
python中使用asyncio实现异步IO实例分析
Feb 26 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中如何判断AJAX提交的数据
2012/02/05 PHP
php获取apk包信息的方法
2014/08/15 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
Javascript Object.extend
2010/05/18 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
简明 Python 基础学习教程
2007/02/08 Python
python实现斐波那契递归函数的方法
2014/09/08 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python selenium xpath定位操作
2020/09/01 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
应届生新闻编辑求职信
2013/11/19 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
生日答谢词
2015/01/05 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
VUE递归树形实现多级列表
2022/07/15 Vue.js