使用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模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
详谈Python基础之内置函数和递归
Jun 21 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
Python实现的knn算法示例
Jun 14 Python
对python中的高效迭代器函数详解
Oct 18 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
对Python w和w+权限的区别详解
Jan 23 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
Python grequests模块使用场景及代码实例
Aug 10 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
ext实现完整的登录代码
2008/08/08 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
vue多次循环操作示例
2019/02/08 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
点球小游戏python脚本
2018/05/22 Python
python文件读写代码实例
2019/10/21 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
公务员年总结的自我评价
2013/10/25 职场文书
办公室助理岗位职责
2013/12/25 职场文书
中国梦的演讲稿
2014/01/08 职场文书
后备干部考察材料
2014/02/12 职场文书
经济担保书范文
2014/04/02 职场文书
经济贸易系求职信
2014/08/04 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python