使用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采集博客中上传的QQ截图文件
Jul 18 Python
Python中的pprint折腾记
Jan 21 Python
解密Python中的描述符(descriptor)
Jun 03 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
python爬取m3u8连接的视频
Feb 28 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
python多进程并行代码实例
Sep 30 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 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
咖啡知识大全
2021/03/03 新手入门
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
php实现图片压缩处理
2020/09/09 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
javascript 节点排序 2
2011/01/31 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python日志模块logging简介
2015/04/13 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
django创建css文件夹的具体方法
2020/07/31 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
高级编程求职信模板
2014/02/16 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
经营目标责任书
2015/05/08 职场文书
运动会跳远广播稿
2015/08/19 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
调解协议书范本
2016/03/21 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers