最优化方法matlab代码(一) 牛顿类方法

news/2024/6/17 22:01:08 标签: matlab, 最优化, 机器学习

 代码:最优化方法牛顿方法matlab代码-从零开始-专业指导文档类资源-CSDN文库https://download.csdn.net/download/benchuspx/58807913目录

1、最速下降法SD

2、Newton方法和修正的Newton方法

基本牛顿方法

阻尼牛顿法

混合牛顿方法

3、拟牛顿方法QN

4、共轭梯度方法

代码:


针对优化问题,常见的优化方法及其特点如下:

1、最速下降法SD

迭代点处目标函数泰勒展开用一次函数近似,迭代方向dk=-gk,步长alpha由(非)精确线搜索得到,x(k+1)=x(k)+alpha*dk),优化速度慢,迭代次数多,实际应用中几乎不使用了。

2、Newton方法和修正的Newton方法

基本牛顿方法

迭代点处目标函数泰勒展开用二次函数近似,dk=-inv(Gk)*gk,步长alpha=1。优化速度快。但是Hessen矩阵Gk不一定是正定和非奇异(可逆)的,而且可能出现迭代方向dk和梯度gk接近正交的情况导致目标函数f下降量极少。基本牛顿方法只有当初始点x0充分接近极小点x*时,才可能收敛,而且每一步都要计算hessan矩阵的值,每一步都要解一个线性方程组Gk*dk=-dk,计算量为o(n3)。

阻尼牛顿法

在基本牛顿法dk=-inv(Gk)*gk的基础上,步长alpha由(非)精确线搜索得到。就是在迭代方向dk上找到alpha使得下一个迭代点处的目标函数值f(xk+alpha*dk)最小。常见的非精确线搜索准则有Armijo准则,Goldstein准则(含Armijo),Wolfe准则(含Armijo),强Wolfe准则(含Armijo)。该方法由于加入了线搜索,即使迭代点离极小点x*稍远,也能收敛。但是仍然没有解决基本牛顿法的Gk可能不正定、奇异的问题。

为了解决牛顿法中迭代点xk处hessan矩阵Gk可能不正定、奇异的情况,产生了各种修正的Newton方法来修正Gk。比较常用的有混合Newton方法LM方法(Gk+v*I)和采用Cholesky(乔利斯基)分解的稳定Newon方法(该法是修正Newton方法中效果最好的,但是一般教科书没有讲)。

混合牛顿方法

在阻尼牛顿方法的基础上,加上如下判断:

如果Gk奇异,那么inv(Gk)不存在,那么这一步改用SD最速下降法,dk=-gk。

如果Gk非奇异但不正定,那么inv(Gk)也不正定,即gk'*inv(Gk)*gk<=0。由牛顿公式dk=-inv(Gk)*gk,则有gk'*dk>=0,即迭代点处的方向导数大于0,说明dk不是下降方向而是上升方向。此时另dk=-dk=inv(Gk)*gk即可。

可见,如果Gk一直奇异,那么此时混合牛顿法就是SD方法了,下降速度会很慢。而且它也继承了牛顿法的缺点,即每一步都要算Hessan矩阵中的二阶偏导值,计算量大。

3、拟牛顿方法QN

为了解决牛顿方法里每一步都需要求hessan矩阵里所有二阶导,而且hessan矩阵可能奇异、不正定的情况,干脆找一个正定对称矩阵B(k)来近似G(k),或者H(k)来近似inv(Gk)。B或者H的初始矩阵可以任意选取或者就选G(0),inv(G(0))。然后每步迭代的时候根据x(k+1)-x(k)和g(k+1)-g(k)来修正B(k)或H(k)。根据B和H的修正构造方式,可以分为对称秩1(SR1)方法和对称秩2方法,SR1和自身对偶,DFP和BFGS都是对称秩2方法且互相对偶。它们都是拟牛顿方法。

QN方法的好处是不用计算二阶导了,而是仅用一阶导就可以近似出G(k), 缺点是每一步都得存储上一步的B(k)或者H(k)。对于维数n很大的大规模优化问题,B和H的存储量是n^2量级,太大了。因此QN方法只能用于中小规模问题。

4、共轭梯度方法

共轭梯度方法和牛顿法的思路不一样。迭代方向选择为共轭梯度方向:dk=-gk+beta(k-1)*d(k-1)。对于目标函数是正定二次函数的问题,beta(k-1)=gk'*gk/(g(k-1)'*g(k-1)),称为FR线性共轭梯度方法。目标函数如果是一般线性函数,beta(k-1)=gk'*(g(k)-g(k-1))/(g(k-1)'g(k-1)),称为PRP非线性共轭梯度方法。

共轭梯度方法的优点是只用到了上一步的梯度和迭代方向向量,没有用到n^2量级的矩阵,因此存储量小,可以解决大规模优化问题。但是在中小规模问题上肯定效果不如QN法。

代码:

最优化方法牛顿方法matlab代码-从零开始-专业指导文档类资源-CSDN文库https://download.csdn.net/download/benchuspx/58807913详尽的线搜索程序,阻尼牛顿、混合牛顿、SR1、BFGS、DFP优化方法,以及三个非线性最小二乘目标函数,输出优化结果和过程图。配有详尽的注释,说明文档和参考文献。

 

注意:
在本次代码中,我使用了代数符号 x 来定义目标函数,并使用 subs 来求解函数值,这样运行效率和运行速度都很慢。最优化方法matlab代码(二) 大规模优化问题_benchuspx的博客-CSDN博客中函数的定义和求值已经全部改用数值计算,运行速度大幅提升。


http://www.niftyadmin.cn/n/948600.html

相关文章

crazyswarm下载编译和使用问题整理

本文写于2021.12.6 最近一次更新为2023.1.5 目录 项目简介 安装步骤 编译报错解决 使用注意 项目简介 crazyswarm版本对应commit为 4d6ca47b085227fbc893479894001d1c7ceab5cc crazyswarm项目地址 GitHub - USC-ACTLab/crazyswarm: A Large Quadcopter SwarmA Large Qu…

最优化方法matlab代码(二) 大规模优化问题

matlab代码链接 大规模优化问题matlab代码-LBFGS/FR/PRP/BB.zip-专业指导文档类资源-CSDN文库https://download.csdn.net/download/benchuspx/73414465大规模优化问题的变量数量n很大&#xff08;几千几万&#xff09;&#xff0c;普通拟牛顿类方法每步都需要用大n^2量级的hes…

ubuntu下matlab安装使用问题汇总

ubuntu18或者ubuntu20下安装matlab 2018a 安装包和参考教程&#xff1a; MATLAB Linux 下载安装与激活运行 - Linux - 蓝色域界 linux ubuntu 安装matlab - 知乎 安装好之后&#xff0c;使用时会遇到一些问题&#xff1a; 目录 1、卡在matlab启动界面无法打开 2、Ubuntu…

win10找不到d3dx9_43.dll,无法正常启动0xc000007b

Win10电脑&#xff0c;安装PhoenixRC时&#xff0c;安装好后点击运行&#xff0c;报错找不到d3dx9_43.dll 按照网上的一些教程下载d3dx9_43.dll并放到C:\Windows\System32\下再运行regsvr32 d3dx9_43.dll 并没有作用。 正确解决办法&#xff1a; 1、腾讯电脑管家--工具箱--电…

科里奥利力的物理理解、推导与加速度变换

目录 1、惯性系与加速度 2、速度变换 3、加速度变换与科氏加速度 4、科氏加速度的理解 ① 加速度变换和速度变换是一脉相承的 ②科氏加速度和向心加速度性质不同 ③科氏加速度由两部分构成 ④科氏加速度的直观感受 5、科里奥利力 科里奥利力&#xff0c;又称科氏力、哥…

解决ubuntu开机变慢;删除耗时启动项

windowsubuntu双系统&#xff0c;其中ubuntu20安装在机械硬盘上。 使用一段时间后ubuntu20的开机时间变的很长&#xff0c;需要2分钟左右&#xff0c;而且开机后一段时间很卡顿。 经过本文解决后开机时间从2min减少到36s。 目录 1、过多开机启动项 2、snapd耗时 3、太多j…

GPG error: https://download.docker.com/linux/ubuntu bionic InRelease: The following signatures could

问题&#xff1a; sudo apt update 报错 &#xff1a; GPG error: https://download.docker.com/linux/ubuntu bionic InRelease: The following signatures couldnt be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 一般遇到NO_PUBKEY只…

github/gitee Readme markdown插入公式方法

有以下几种方法&#xff1a; 1、用$ $直接插入 对于简单公式和单行公式&#xff0c;可以直接用$输入,$$是居中。 // 公式靠左 $公式latex代码$// 公式居中 $$公式latex代码$$ 缩进可以用tab符号 &emsp; 2、用 codecogs 外链 github、gitee等很多地方Readme的Markdown…