使用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中degrees()方法的使用
May 18 Python
Python匹配中文的正则表达式
May 11 Python
python遍历序列enumerate函数浅析
Oct 17 Python
理论讲解python多进程并发编程
Feb 09 Python
Python开发网站目录扫描器的实现
Feb 21 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
Python实现查找数据库最接近的数据
Jun 08 Python
python实现批处理文件
Jul 28 Python
Python django中如何使用restful框架
Jun 23 Python
Python绘制散乱的点构成的图的方法
Apr 21 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/01/14 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
Django自定义分页效果
2017/06/27 Python
基于Python实现用户管理系统
2019/02/26 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Python如何实现远程方法调用
2020/08/07 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
教你一步步实现一个简易promise
2021/11/02 Javascript