本文使用 Zhihu On VSCode 创作并发布
牛顿算法
对于优化函数
,
,二阶连续可导
在
处泰勒展开,取前三项,即对于优化函数二阶拟合
其中
,为函数梯度;
,为函数的Hesse矩阵
当
正定时,上式存在极小值,使得
可得牛顿法迭代公式:
- 可见,对于牛顿法,需要计算二阶偏导数(Hesse矩阵),且Hesse矩阵必须可逆、正定
- 并且,牛顿法对于迭代初始值
也有要求,当距离最优解足够近时,算法才收敛
阻尼牛顿法
阻尼牛顿法解决了第二个问题,使得算法全局收敛主要方法是引入线搜索技术,使得算法满足收敛性条件,关于线搜索技术
线搜索
算法:
给定迭代初始值
,和容许误差
计算梯度
if
,break;输出当前
else 解方程:
求出迭代方向$d_k$, to step 2
利用Armijo准则算法,计算迭代步长
k=k+1;to step 1
修正的牛顿算法
上面算法有前提条件1(Hesse矩阵正定)
为了扩大算法的适用范围,对算法修正,解决条件1 的强制条件,有两种方法
方法1:
对于阻尼牛顿算法求得的迭代方向
,检查是否满足收敛条件:
if 满足
else
就是牛顿算法和梯度下降算法的混合算法,当牛顿算法求得迭代方向不满足收敛条件,使用负梯度方向为迭代方向
==关于为什么不直接使用梯度下降法==
可以证明:牛顿算法是二阶收敛,梯度下降线性收敛【牛顿法收敛速度快】
方法2
引进阻尼因子
,对Hesse矩阵修正,选择适当
,使得
正定
方法二matlab代码
function
main functin
clc
result
conclusion
上述图像为函数值随迭代次数变化,可见收敛速度较快;且计算结果较精确;
reference
《最优化方法及其matlab程序设计》