最优化方法Python计算:牛顿算法

设函数 f ( x ) f(\boldsymbol{x}) f(x) x ∈ R n \boldsymbol{x}\in\text{ℝ}^n xRn二阶连续可微,记 g ( x ) = ∇ f ( x ) \boldsymbol{g}(\boldsymbol{x})=\nabla f(\boldsymbol{x}) g(x)=f(x) H ( x ) = ∇ 2 f ( x ) \boldsymbol{H}(\boldsymbol{x})=\nabla^2f(\boldsymbol{x}) H(x)=2f(x)。由于 H ( x ) \boldsymbol{H}(\boldsymbol{x}) H(x)连续,故 H ⊤ ( x ) = H ( x ) \boldsymbol{H}^\top(\boldsymbol{x})=\boldsymbol{H}(\boldsymbol{x}) H(x)=H(x),即 H ( x ) \boldsymbol{H}(\boldsymbol{x}) H(x)是一个对称矩阵。若 f ( x ) f(\boldsymbol{x}) f(x)有极小值点 x 0 \boldsymbol{x}_0 x0,则在 x 0 \boldsymbol{x}_0 x0的近旁 H ( x ) \boldsymbol{H}(\boldsymbol{x}) H(x)是正定的。对具有连续Hesse阵的函数 f ( x ) f(\boldsymbol{x}) f(x) x 0 \boldsymbol{x}_0 x0近旁点 x k \boldsymbol{x}_k xk处的二阶泰勒展开式为
f ( x ) = f ( x k ) + g k ⊤ ( x − x k ) + 1 2 ( x − x k ) ⊤ H k ( x − x k ) + o ( ∥ x − x k ∥ 2 ) . f(\boldsymbol{x})=f(\boldsymbol{x}_k)+g_k^\top(\boldsymbol{x}-\boldsymbol{x}_k)+\frac{1}{2}(\boldsymbol{x}-\boldsymbol{x}_k)^\top\boldsymbol{H}_k(\boldsymbol{x}-\boldsymbol{x}_k)+o(\lVert\boldsymbol{x}-\boldsymbol{x}_k\rVert^2). f(x)=f(xk)+gk(xxk)+21(xxk)Hk(xxk)+o(∥xxk2).
其中, g k = ∇ f ( x k ) \boldsymbol{g}_k=\nabla f(\boldsymbol{x}_k) gk=f(xk) H k = H ( x k ) = ∇ 2 f ( x k ) \boldsymbol{H}_k=\boldsymbol{H}(\boldsymbol{x}_k)=\nabla^2f(\boldsymbol{x}_k) Hk=H(xk)=2f(xk)。令
q k ( x ) = f ( x k ) + g k ⊤ ( x − x k ) + 1 2 ( x − x k ) ⊤ H k ( x − x k ) q_k(\boldsymbol{x})=f(\boldsymbol{x}_k)+\boldsymbol{g}_k^\top(\boldsymbol{x}-\boldsymbol{x}_k)+\frac{1}{2}(\boldsymbol{x}-\boldsymbol{x}_k)^\top\boldsymbol{H}_k(\boldsymbol{x}-\boldsymbol{x}_k) qk(x)=f(xk)+gk(xxk)+21(xxk)Hk(xxk)
q k ( x k ) = f ( x k ) q_k(\boldsymbol{x}_k)=f(\boldsymbol{x}_k) qk(xk)=f(xk) ∇ q k ( x k ) = ∇ f ( x k ) \nabla q_k(\boldsymbol{x}_k)=\nabla f(\boldsymbol{x}_k) qk(xk)=f(xk) ∇ 2 q k ( x k ) = ∇ 2 f ( x k ) \nabla^2q_k(\boldsymbol{x}_k)=\nabla^2f(\boldsymbol{x}_k) 2qk(xk)=2f(xk)。因此当 x \boldsymbol{x} x x k \boldsymbol{x}_k xk近旁时,可用二次型函数 q k ( x ) q_k(\boldsymbol{x}) qk(x)作为 f ( x ) f(\boldsymbol{x}) f(x)的近似表示。由 ∇ 2 q k ( x k ) = ∇ 2 f ( x k ) = H k \nabla^2q_k(\boldsymbol{x}_k)=\nabla^2f(\boldsymbol{x}_k)=\boldsymbol{H}_k 2qk(xk)=2f(xk)=Hk的正定性知二次型函数 q k ( x ) q_k(\boldsymbol{x}) qk(x)有唯一最小值点。由于 q k ( x ) q_k(\boldsymbol{x}) qk(x)二阶连续可微,故其最小值点必为其驻点: o = q k ′ ( x ) = ∇ q k ( x ) = ∇ f ( x k ) + ∇ 2 f ( x k ) ( x − x k ) = g k + H k x − H k x k \boldsymbol{o}=q'_k(\boldsymbol{x})=\nabla q_k(\boldsymbol{x})=\nabla f(\boldsymbol{x}_k)+\nabla^2f(\boldsymbol{x}_k)(\boldsymbol{x}-\boldsymbol{x}_k)=\boldsymbol{g}_k+\boldsymbol{H}_k\boldsymbol{x}-\boldsymbol{H}_k\boldsymbol{x}_k o=qk(x)=qk(x)=f(xk)+2f(xk)(xxk)=gk+HkxHkxk。即 q k ( x ) q_k(\boldsymbol{x}) qk(x)的驻点 x k + 1 \boldsymbol{x}_{k+1} xk+1满足
H k x k + 1 = H k x k − g k . \boldsymbol{H}_k\boldsymbol{x}_{k+1}=\boldsymbol{H}_k\boldsymbol{x}_k-\boldsymbol{g}_k. Hkxk+1=Hkxkgk.
H k \boldsymbol{H}_k Hk的正定性知 H k \boldsymbol{H}_k Hk可逆,故由上式可解得 q k ( x ) q_k(\boldsymbol{x}) qk(x)的最小值点(如下图所示)
x k + 1 = x k − H k − 1 g k . ( 1 ) \boldsymbol{x}_{k+1}=\boldsymbol{x}_k-\boldsymbol{H}_k^{-1}\boldsymbol{g}_k.\quad\quad(1) xk+1=xkHk1gk.(1)
在这里插入图片描述
在对目标函数 f ( x ) f(\boldsymbol{x}) f(x)如上描述的条件下,式(1)构成搜索 f ( x ) f(\boldsymbol{x}) f(x)的最优解 x 0 \boldsymbol{x}_0 x0的迭代式:初始时,在 x 0 \boldsymbol{x}_0 x0的近旁任取点 x 1 \boldsymbol{x}_1 x1,此时可保证 f ( x ) f(\boldsymbol{x}) f(x) x 1 \boldsymbol{x}_1 x1处的Hesse阵 H 1 = ∇ 2 f ( x 1 ) \boldsymbol{H}_1=\nabla^2f(\boldsymbol{x}_1) H1=2f(x1)是正定的。若 x 1 = x 0 \boldsymbol{x}_1=\boldsymbol{x}_0 x1=x0,则得到了最优解 x 1 = x 0 \boldsymbol{x}_1=\boldsymbol{x}_0 x1=x0。否则按式(1)可算得点 x 2 = x 1 − H 1 − 1 g k \boldsymbol{x}_2=\boldsymbol{x}_1-\boldsymbol{H}_1^{-1}\boldsymbol{g}_k x2=x1H11gk。由于 x 2 \boldsymbol{x}_2 x2 q 1 ( x ) q_1(\boldsymbol{x}) q1(x)的最小值点,故 q 1 ( x ) q_1(\boldsymbol{x}) q1(x) x 1 \boldsymbol{x}_1 x1 x 2 \boldsymbol{x}_2 x2函数值是下降的。由 f ( x ) f(\boldsymbol{x}) f(x) q 1 ( x ) q_1(\boldsymbol{x}) q1(x) x 1 \boldsymbol{x}_1 x1处的相近性可知 f ( x ) f(\boldsymbol{x}) f(x) x 1 \boldsymbol{x}_1 x1 x 2 \boldsymbol{x}_2 x2函数值也是下降的,故可望 x 2 \boldsymbol{x}_2 x2 x 1 \boldsymbol{x}_1 x1更接近 x 0 \boldsymbol{x}_0 x0。若 ∇ f ( x 2 ) = o \nabla f(\boldsymbol{x}_2)=\boldsymbol{o} f(x2)=o,则按 f ( x ) f(\boldsymbol{x}) f(x)所具有的
单峰性知,我们得到了最优解 x 2 = x 0 \boldsymbol{x}_2=\boldsymbol{x}_0 x2=x0。否则,可由式(1)计算 x 3 \boldsymbol{x}_3 x3,……,按此方式算得点 x k \boldsymbol{x}_k xk,且 x k \boldsymbol{x}_k xk位于 x 0 \boldsymbol{x}_0 x0的近旁。若此时 ∇ f ( x k ) = o \nabla f(\boldsymbol{x}_k)=\boldsymbol{o} f(xk)=o,则得到最优解 x k = x 0 \boldsymbol{x}_k=\boldsymbol{x}_0 xk=x0。否则,可由式(1)算得更接近 x 0 \boldsymbol{x}_0 x0的点 x k + 1 = x k − H k − 1 g k \boldsymbol{x}_{k+1}=\boldsymbol{x}_k-\boldsymbol{H}_k^{-1}\boldsymbol{g}_k xk+1=xkHk1gk,如上图所示。用这样的方法计算目标函数最优解的迭代序列算法称为牛顿法
下列代码实现牛顿算法。

import numpy as np                          #导入numpy
from scipy.optimize import OptimizeResult   #导入OptimizeResult
def newton(f, x1, gtol, **options):xk=x1gk=grad(f,xk)Hk=hess(f,xk)k=1while np.linalg.norm(gk)>=gtol:xk-=np.matmul(np.linalg.inv(Hk),gk)gk=grad(f,xk)Hk=hess(f,xk)k+=1bestx=xkbesty=f(bestx)return OptimizeResult(fun=besty, x=bestx, nit=k)

程序的第3~15行定义的newton函数实现牛顿算法。参数f,x1,gtol分别表示目标函数 f ( x ) f(\boldsymbol{x}) f(x),初始点 x 1 \boldsymbol{x}_1 x1和容错误差 ε \varepsilon ε,options实现minimize与本函数的信息交换机制。
第4~7行执行初始化操作:第4行将表示迭代点的xk初始化为x1。第5、6行分别调用函数grad和hess(详见博文《最优化方法Python计算:n元函数梯度与Hesse阵的数值计算》)计算目标函数 f ( x ) f(\boldsymbol{x}) f(x)在当前点 x 1 \boldsymbol{x}_1 x1处的梯度 ∇ f ( x 1 ) \nabla f(\boldsymbol{x}_1) f(x1)和Hesse矩阵 ∇ 2 f ( x 1 ) \nabla^2f(\boldsymbol{x}_1) 2f(x1),赋予gk和Hk。第7行将迭代次数k初始化为1。
第8~12行的while循环执行迭代操作:第9行按式(1)
x k + 1 = x k − H k − 1 g k \boldsymbol{x}_{k+1}=\boldsymbol{x}_k-\boldsymbol{H}_k^{-1}\boldsymbol{g}_k xk+1=xkHk1gk
计算迭代点更新xk。其中调用numpy.linalg的inv函数计算 H \boldsymbol{H} H的逆矩阵 H k − 1 \boldsymbol{H}_k^{-1} Hk1,调用numpy的matmul函数计算矩阵的积 H k − 1 g k \boldsymbol{H}_k^{-1}\boldsymbol{g}_k Hk1gk。第10、11行调用grad函数和hess函数计算 ∇ f ( x k + 1 ) \nabla f(\boldsymbol{x}_{k+1}) f(xk+1)和Hesse矩阵 ∇ 2 f ( x k + 1 ) \nabla^2f(\boldsymbol{x}_{k+1}) 2f(xk+1)更新gk和Hk。第12行将迭代次数k自增1。循环往复,直至条件
∥ g k ∥ < ε \lVert\boldsymbol{g}_k\rVert<\varepsilon gk<ε
成立为止。
第13~15行用 f ( x k ) f(\boldsymbol{x}_k) f(xk) x k \boldsymbol{x}_k xk k k k构造OptimizeResult(第2行导入)对象并返回。
例1 给定 ε = 1 0 − 8 \varepsilon=10^{-8} ε=108为容错误差,分别以 ( 0 0 ) \begin{pmatrix}0\\0\end{pmatrix} (00) ( − 1.2 1 ) \begin{pmatrix}-1.2\\1\end{pmatrix} (1.21)作为初始点 x 1 \boldsymbol{x}_1 x1,用newton函数计算Rosenbrock函数的最优解。
:下列代码完成计算。

import numpy as np                                              #导入numpy
from scipy.optimize import minimize, rosen                      #导入minimize, rosen
x1=np.array([0,0])                                              #设置初始点
res=minimize(rosen, x1,method=newton, options={'gtol':1e-8})    #计算最优解
print(res)
x1=np.array([-1.2,1])                                           #设置初始点
res=minimize(rosen, x1,method=newton, options={'gtol':1e-8})    #计算最优解
print(res)

程序的第3~ 4行及第6~7行分别以 ( 0 0 ) \begin{pmatrix}0\\0\end{pmatrix} (00) ( − 1.2 1 ) \begin{pmatrix}-1.2\\1\end{pmatrix} (1.21)作为初始点 x 1 \boldsymbol{x}_1 x1调用minimize传递newton计算Rosenbrock函数容错误差为 1 0 − 8 10^{-8} 108的最优解近似值。运行程序,输出

 fun: 6.156132219000243e-22nit: 7x: array([1., 1.])fun: 1.4934237207405332e-18nit: 11x: array([1., 1.])

前3行表示从 x 1 = ( 0 0 ) \boldsymbol{x}_1=\begin{pmatrix}0\\0\end{pmatrix} x1=(00)起,迭代7次,newton算得最优解 ( 1 1 ) \begin{pmatrix}1\\1\end{pmatrix} (11),后3行则表示newton从 x 1 = ( − 1.2 1 ) \boldsymbol{x}_1=\begin{pmatrix}-1.2\\1\end{pmatrix} x1=(1.21)起,迭代11次,算得最优解。读者可以相同起点及容错误差用FR共轭梯度算法计算Rossenbrock函数的最优解的结果相比较,将看到牛顿算法比FR共轭梯度法(详见博文《最优化方法Python计算:非二次型共轭梯度算法》)计算(对两个不同的初始点,在相同的容错误差下分别迭代24次和20次)效率更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java后端开发面试题——框架篇

Spring框架中的bean是单例的吗&#xff1f;Spring框架中的单例bean是线程安全的吗&#xff1f; singleton : bean在每个Spring IOC容器中只有一个实例。 prototype&#xff1a;一个bean的定义可以有多个实例。 Spring bean并没有可变的状态(比如Service类和DAO类)&#xff0c…

模板函数实现交换_折半查找_友元函数_运算符重载

模板的本质 模板函数实现交换 #include <stdio.h>template<class T> void myswap(T &l, T &r) {T tmp;tmp = r;r = l;l =<

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 目录 时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 程序设计 完整…

(成功踩坑)electron-builder打包过程中报错

目录 注意&#xff1a;文中的解决方法2&#xff0c;一定全部看完&#xff0c;再进行操作&#xff0c;有坑 背景 报错1&#xff1a; 报错2&#xff1a; 1.原因&#xff1a;网络连接失败 2.解决方法1&#xff1a; 3.解决方法2&#xff1a; 3.1查看缺少什么资源文件 3.2去淘…

css学习4(背景)

1、CSS中&#xff0c;颜色值通常以以下方式定义: 十六进制 - 如&#xff1a;"#ff0000"RGB - 如&#xff1a;"rgb(255,0,0)"颜色名称 - 如&#xff1a;"red" 2、background-image 属性描述了元素的背景图像. 默认情况下&#xff0c;背景图像进…

2023 - java - 强制类型转换和装箱

强制类型转换和装箱&#xff1a; 在 Java 中&#xff0c;(Integer) 和(int) 是两个不同的类型转换操作符&#xff0c;它们的效果是不一样的。 int a (Integer) t.getContent(); 这条语句使用了装箱&#xff08;Boxing&#xff09;操作&#xff0c;将一个整数对象&#xff08;…

视频上传,限制时长,获取视频时长

使用element的upload上传文件时&#xff0c;除了类型和大小&#xff0c;需求需要限制只能长传18秒内的视频&#xff0c;这里通过upload的before-upload&#xff0c;以及创建一个音频元素对象拿到durtaion时长属性来实现。 getVideoTime(file) {return new Promise(async (resol…

JVM的元空间了解吗?

笔者近期在面试的时候被问到了这个问题&#xff0c;元空间也是Java8当时的一大重大革新&#xff0c;之前暑期实习求职的时候有专门看过&#xff0c;但是近期秋招的时候JVM相关的内容确实有点生疏了&#xff0c;故在此进行回顾。 结构 首先&#xff0c;我们应了解JVM的堆结构&a…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

sql in mac学习记录

鉴于有一段时间没有访问mysql了&#xff0c;最近打算在mac 系统上下载mysql 练习一下sql的使用&#xff0c;于是 First, the mysql download https://dev.mysql.com/downloads/mysql/ Second, Mysql install steps Install the software by normally install one software …

opencv常用API记录(C++版)

文章目录 1. cv::Mat(cv::Rect) 是什么含义2. cv::Mat初始化 cv::Mat(1, 32, CV_32F,XXX)什么意思3. 如何使用opencv的多线程接口来跑多张图的resize 1. cv::Mat(cv::Rect) 是什么含义 cv::Mat(cv::Rect) 是一种使用矩形区域来构造新的 cv::Mat 对象的方式&#xff0c;其中 cv…

刷算法常见注意点

num 正无穷&#xff1a;Infinity 金额格式化&#xff1a;利用字符串提供的toLocaleString()方法处理。有时候不生效&#xff0c;比如app 数字容错&#xff1a;if(!Number.isFinite(num)){ //不是数字} js数组 头部添加unshift 、尾部增加push、首部删除shift、尾部删除pop…

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图) 目录 时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 时序预测 | MATLAB实现ELM极

最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6 解…

前端-初始化Vue3+TypeScript

如果使用如下命令初始化项目&#xff0c;项目很干净&#xff0c;很适合了解项目的各个结构。 npm init vitelatest如果使用如下命令初始化项目&#xff0c;是可以选择你需要的组件 npm init vuelatest

vue根据template结构自动生成css/scss/less样式嵌套

vscode搜索安装插件&#xff1a;AutoScssStruct4Vue

十、接口(3)

本章概要 接口适配接口字段 初始化接口中的字段 接口嵌套接口和工厂方法模式 接口适配 接口最吸引人的原因之一是相同的接口可以有多个实现。在简单情况下体现在一个方法接受接口作为参数&#xff0c;该接口的实现和传递对象则取决于方法的使用者。 因此&#xff0c;接口的…

Linux 系统的如何优化(面试题)

Linux 系统的如何优化&#xff08;面试题&#xff09; (1) 禁用不需要的服务 ntsysv 命令最为方便&#xff0c;执行后&#xff0c;把不需要的勾选去掉就行 &#xff08;2&#xff09;避免直接使用root用户&#xff0c;普遍用户通过sudo授权操作 &#xff08;3&#xff09;通过…

wustojc日期格式变化

#include <stdio.h> int main() {char a[10];for(int i0;i<10;i){//用一个耍聪明的方法&#xff0c;全部用数组存储&#xff1b;面向结果编程a[0]getchar();}printf("%c%c%c%c%c%c%c%c%c%c",a[6],a[7],a[8],a[9],a[2],a[0],a[1],a[5],a[3],a[4]);return 0;}…

数据结构:栈和队列

文章目录 一、栈1.栈的概念及结构1.栈的概念及结构2.栈的实现 2.栈的顺序表实现1.栈的结构体和实现的功能函数2.栈的初始化&#xff0c;入栈和出栈操作3.栈的其他操作 3.栈的链表实现1.栈的结构体和实现的功能函数2.栈功能函数的实现 二、队列1.队列的概念及结构1.队列的概念及…