使用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中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
浅析python中的分片与截断序列
Aug 09 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
python绘制直线的方法
Jun 30 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
pycharm中显示CSS提示的知识点总结
Jul 29 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
一文读懂Python 枚举
Aug 25 Python
python安装第三方库如xlrd的方法
Oct 31 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
图书管理程序(三)
2006/10/09 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
js中的面向对象入门
2017/03/06 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
vue中轮训器的使用
2019/01/27 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
python处理document文档保留原样式
2019/09/23 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
雷锋的观后感
2015/06/10 职场文书
计算机实训心得体会
2016/01/14 职场文书
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python