最优化方法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.rhkb.cn/news/97394.html

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

相关文章

npm install ffi各种失败,换命令npm i ffi-napi成功

网上各种帖子安装ffi&#xff0c;基本上到了windows build tools这里会卡住。 使用命令npm install --global --production windows-build-tools 安装报错信息如下&#xff1a; PS E:\codes\nodejsPath\tcpTest> npm install --global --production windows-build-tools …

T113-S3-TCA6424-gpio扩展芯片调试

目录 前言 一、TCA6424介绍 二、原理图连接 三、设备树配置 四、内核配置 五、gpio操作 总结 前言 TCA6424是一款常用的GPIO&#xff08;通用输入输出&#xff09;扩展芯片&#xff0c;可以扩展微控制器的IO口数量。在T113-S3平台上&#xff0c;使用TCA6424作为GPIO扩展芯…

5G技术与其对智能城市、物联网和虚拟现实领域的影响

随着第五代移动通信技术&#xff08;5G&#xff09;的到来&#xff0c;我们即将迈向一个全新的数字化世界。5G技术的引入将带来更高的速度、更低的延迟和更大的连接性&#xff0c;推动了智能城市、物联网和虚拟现实等领域的发展。 首先&#xff0c;5G技术将带来超越以往的网络速…

1.进程控制

1.进程概念 进程是管理事务的基本单元 2.并发并行 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。并发(concurrency)&#xff1a;指在同一时刻只能有一条指令执行&#xff0c;但多个进程指令被快速的轮换执行&#xff0c;使得在宏观上…

驱动开发——字符设备

字符设备 Linux 将系统设备分为&#xff1a;字符设备、块设备、网络设备。工作原理 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c; 按照字节流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。在Linux的世界里面一切…

“Spring管理JavaBean的过程及Bean的生命周期“

目录 引言1.弹簧容器2. Bean的生命周期2.1 配置javaBean2.2. 解析Bean的定义2.3 检查是否需要添加自己的功能2.4 初始化2.5 实现Aware接口2.6 扩展2.7. 销毁 3. 单例模式和原型模式3.1. 单例模式3.2. 原型模式 4. 总结 引言 Spring框架是一个非常流行的Java应用程序框架&#…

Spring事件监听源码解析

spring事件监听机制离不开容器IOC特性提供的支持&#xff0c;比如容器会自动创建事件发布器&#xff0c;自动识别用户注册的监听器并进行管理&#xff0c;在特定的事件发布后会找到对应的事件监听器并对其监听方法进行回调。Spring帮助用户屏蔽了关于事件监听机制背后的很多细节…

Selenium的使用:WEB功能测试

Selenium是ThrougthWorks公司一个强大的开源WEB功能测试工具系列&#xff0c;本系统包括多款软件 Selenium语言简单&#xff0c;用(Command,target,value)三种元素组成一个行为&#xff0c;并且有协助录制脚本工具&#xff0c;但Selenese有一些严格的限制&#xff1a; …

FFmpeg5.0源码阅读——VideoToobox硬件解码

摘要&#xff1a;本文描述了FFmpeg中videotoobox解码器如何进行解码工作&#xff0c;如何将一个编码的码流解码为最终的裸流。   关键字&#xff1a;videotoobox,decoder,ffmpeg   VideoToolbox 是一个低级框架&#xff0c;提供对硬件编码器和解码器的直接访问。 它提供视频…

C语言:字符函数和字符串函数

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解C语言&#xff1a;指针详解C语言&#xff1a;结构体C语言&#xff1a;数据的存储 目录 往期文章前言1. 函数介绍1.1 strlen1.…

速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

一个完整的嵌入式系统&#xff0c;包括任务执行部分和人机交互部分。在前四节中&#xff0c;我们已经讲解了LED、LCD和按键&#xff0c;用这三者就能够实现一个人机交互系统&#xff0c;也即搭建整个嵌入式系统的框架。在后续&#xff0c;只要将各个功能加入到这个交互系统中&a…

【数据库系统】--【2】DBMS架构

DBMS架构 01DBMS架构概述02 DBMS的物理架构03 DBMS的运行和数据架构DBMS的运行架构DBMS的数据架构PostgreSQL的体系结构RMDB的运行架构 04DBMS的逻辑和开发架构DBMS的层次结构DBMS的开发架构DBMS的代码架构 05小结 01DBMS架构概述 02 DBMS的物理架构 数据库系统的体系结构 数据…

pytorch 42 C#使用onnxruntime部署内置nms的yolov8模型

在进行目标检测部署时,通常需要自行编码实现对模型预测结果的解码及与预测结果的nms操作。所幸现在的各种部署框架对算子的支持更为灵活,可以在模型内实现预测结果的解码,但仍然需要自行编码实现对预测结果的nms操作。其实在onnx opset===11版本以后,其已支持将nms操作嵌入…

Maven - 统一构建规范:Maven 插件管理最佳实践

文章目录 Available Plugins开源项目中的使用插件介绍maven-jar-pluginmaven-assembly-pluginmaven-shade-pluginShade 插件 - 标签artifactSetrelocationsfilters 完整配置 Available Plugins https://maven.apache.org/plugins/index.html Maven 是一个开源的软件构建工具&…

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…

visual studio 2022配置

前提&#xff1a;我linux c 开发 一直在使用vscode 更新了个版本突然代码中的查找所用引用和变量修改名称不能用了&#xff0c;尝试了重新配置clang vc都不行&#xff0c;估计是插件问题&#xff0c;一怒之下改用visual studio 2022 为了同步2个IDE之间的差别&#xff0c;目前…

知识继承概述

文章目录 知识继承第一章 知识继承概述1.背景介绍第一页 背景第二页 大模型训练成本示例第三页 知识继承的动机 2.知识继承的主要方法 第二章 基于知识蒸馏的知识继承预页 方法概览 1.知识蒸馏概述第一页 知识蒸馏概述第二页 知识蒸馏第三页 什么是知识第四页 知识蒸馏的核心目…

LeetCode_Java_2236. 判断根结点是否等于子结点之和

2236. 判断根结点是否等于子结点之和 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。 示例1 输入&#xff1a;roo…

每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等图论深度优先遍历递归)

今日份题目&#xff1a; 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例1 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…