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

news2024/12/25 23:59:03

设函数 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 ∥ ) . 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). f(x)=f(xk)+gk(xxk)+21(xxk)Hk(xxk)+o(∥xxk∥).
其中, 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。否则按式(3.9)可算得点 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=x1
    gk=grad(f,xk)
    Hk=hess(f,xk)
    k=1
    while np.linalg.norm(gk)>=gtol:
        xk-=np.matmul(np.linalg.inv(Hk),gk)
        gk=grad(f,xk)
        Hk=hess(f,xk)
        k+=1
    bestx=xk
    besty=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-22
 nit: 7
   x: array([1., 1.])
 fun: 1.4934237207405332e-18
 nit: 11
   x: 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.coloradmin.cn/o/899094.html

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

相关文章

【数据结构OJ题】用栈实现队列

原题链接&#xff1a;https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用两个栈实现&#xff0c;一个栈进行入队操作&#xff0c;另一个栈进行出队操作。 出队操作&#xff1a; 当出队的栈…

ARFoundation避坑记录

网上很多人说这个要改成可选的&#xff0c;否则如果没有安装arcore就会自动弹窗&#xff0c;但是如果关闭了&#xff0c;确实不会弹窗了&#xff0c;但是检测设备的代码也不能完美执行了&#xff0c;如果设备安装了arcore还好&#xff0c;如果没有安装测无法检测。 如果不想有…

常见的CRM系统报价

一个CRM系统大概多少钱&#xff1f;CRM系统的价格因为不同的厂商、功能、部署方式、用户数等因素而有很大的差异&#xff0c;没有一个固定的标准。但是&#xff0c;我们可以根据一些常见的CRM软件的报价&#xff0c;对CRM价格有一个大致的了解。 一、CRM的部署方式 CRM系统的…

填充柄功能

单元格右下角十字符号 顺序式填充 输入1,2&#xff0c;直接拉取即可实现顺序1到10. 复制式填充 CtrlD或者拉取&#xff0c;选择右下角复制单元格。 规律式填充 输入星期一&#xff0c;星期二&#xff0c;下拉一直可以到星期日 自定义填充 选择文件-》选项-》自定义序列 输…

AI工程师招募;60+开发者AI工具清单;如何用AI工具读懂插件源码;开发者出海解读;斯坦福LLM课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 一则AI工程师招募信息&#xff1a;新领域需要新技能 Vision Flow (目的涌现) 是一家基于 AGI 原生技术的创业公司&#xff0c;是全球探…

CSGO饰品价格会一直下跌吗?市场何时止跌回升?

最后一届巴黎major终于落下帷幕&#xff0c;Vitality小蜜蜂2-0战胜GL成功赢下本次Major冠军&#xff0c;也是首次夺得Major冠军&#xff01;有人欢喜有人忧啊&#xff0c;csgo搬砖的饰品商人们一点也高兴不起来。 4月-5月&#xff0c;csgo皮肤饰品已持续走低快两个月了。手里满…

OPTEE3.17+ubuntu20.04+qemu_v8搭建OPTEE开发环境

参考文章&#xff1a; https://blog.csdn.net/capodexi/article/details/123548850 https://blog.csdn.net/qq_42557044/article/details/130973200 https://blog.csdn.net/zhuwade/article/details/125513873 https://zhuanlan.zhihu.com/p/521196386 https://blog.csdn.net/…

wsl2 安装cuda

1 设置为清华源 首先登录wsl 直接命令 wsl 就行 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /e…

AVL树的讲解

算法拾遗三十八AVL树 AVL树AVL树平衡性AVL树加入节点AVL删除节点AVL树代码 AVL树 AVL树具有最严苛的平衡性&#xff0c;&#xff08;增、删、改、查&#xff09;时间复杂度为O&#xff08;logN&#xff09;&#xff0c;AVL树任何一个节点&#xff0c;左树的高度和右树的高度差…

为什么美元美债没有出现死亡螺旋?

号外&#xff1a;刘教链最新文章&#xff0c;欢迎点击阅读&#xff1a; 公众号「刘教链内参」8.18发表&#xff1a;《内参&#xff1a;SEC批准ETF将推高大饼至15-18w$ &#xff1f;》。 公众号「刘教链Pro」8.18发表&#xff1a;《大饼插爆两万五》。 * * * * * * 如果我们把美…

Linux系统基础服务启动的方法

服务&#xff0c;其实就是运行在操作系统后台的一个或者多个应用程序&#xff0c;为计算机系统或用户提供某项特定的服务。Linux系统运行的绝大多数服务都是需要安装才有的&#xff0c;例如FTP服务、httpd服务、MySQL、redis、Zookeeper、rabbitmq、vsftpd等等&#xff0c;那么…

面试题 ①

1、请讲一下常见的SQL优化方法&#xff08;至少10条&#xff09; 1.尽量避免使用子查询 虽然在 mysql5.6 版本之后对 select 的子查询用 join关联方式 做了优化&#xff0c;但是update/delete子查询依然先查外表再查内表&#xff0c;当外表过大时查询速度会很慢&#xff1b;因此…

浙大数据结构第八周之08-图7 公路村村通

题目详情&#xff1a; 现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08…

Linux 应急响应命令总结【持续更新】

系统基本信息 CPU 信息 CPU 信息&#xff1a; lscpu操作系统信息 操作系统信息&#xff1a; uname -a操作系统信息&#xff1a; cat /proc/version模块信息 模块信息&#xff1a; lsmod账户信息 系统所有账户 系统所有账户&#xff1a; cat /etc/passwd超级权限账户…

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接&#xff1a;202. 快乐数 题目内容&#xff1a; 理解题意&#xff0c;快乐数就是重复每位数的平方之和得到的新数的过程&#xff0c;最终这个数能变成1。变成1以后&…

STM32 串口复习

按数据通信方式分类&#xff1a; 串行通信&#xff1a;数据逐位按顺序依次传输。传输速率较低&#xff0c;抗干扰能力较强&#xff0c;通信距离较长&#xff0c;I/O资源占用较少&#xff0c;成本较低。并行通信&#xff1a;数据各位通过多条线同时传输。 按数据传输方向分类&…

04_Redis与mysql数据双写一致性案例

04——redis与mysql数据双写一致性 一、canal 是什么 canal[ka’nel,中文翻译为水道/管道/沟渠/运河&#xff0c;主要用途是用于MySQL数据库增量日志数据的订阅、消费和解析&#xff0c;是阿里巴巴开发并开源的,采用Java语言开发&#xff1b; 历史背景是早期阿里巴巴因为杭州和…

你知道CSGO转区内购吗?了解下内购系统!

哈喽&#xff0c;大家好&#xff0c;我是童话姐姐&#xff0c;这两天群里很多人都在问关于内购的事情&#xff0c;今天就专门给大家讲一下关于内购的一些情况吧。 1、首先什么是转区内购? 顾名思义&#xff0c;内购就是在游戏内部的一个购买行为&#xff0c;csgo内购自然就是…

MATLAB打开excel读取写入操作例程

本文使用素材含代码测试用例等 MATLAB读写excel文件历程含&#xff0c;内含有测试代码资源-CSDN文库 打开文件 使用uigetfile函数过滤非xlsx文件&#xff0c;找到需要读取的文件&#xff0c;首先判断文件是否存在&#xff0c;如果文件不存在&#xff0c;程序直接返回&#x…

all in one之安装ubuntu-server系统(第二章)

pve安装ubuntu-server系统 安装ubuntu-server系统 参考链接 在pve环境下安装ubuntu服务器版本&#xff0c;安装过程如下&#xff1a; ubuntu官方链接&#xff08;不推荐&#xff0c;下载慢&#xff09; 中科大开源库 阿里开源镜像库 兰州大学开源镜像站 … 自行选择进行下载&…