最优化学习笔记(十九)——拟牛顿法(5)BFGS算法

一、BFGS算法的更新公式

    为了推导BFGS算法,需要用到对偶或者互补的概念,前边已经讨论过hessian矩阵逆矩阵的近似矩阵需要满足以下条件:

Hk+1Δg(i)=Δx(i)0ik

这是根据 Δg(i)=QΔx(i),0ik 推导出来的。基于这一条件可以构造hessian矩阵逆矩阵近似矩阵的更新公式,秩1算法和DFP算法都是据此而来。但是除了构造逆矩阵的近似矩阵以外,还可以直接构造矩阵 Q 的近似矩阵。令矩阵 Bk 表示在第 k 次迭代中关于矩阵Q的估计,则 Bk+1 应该满足
Δg(i)=Bk+1Δx(i),0ik

可以看出,这组方程与 Hk+1 应该满足的方程十分相似,唯一的区别在于 Δg(i) Δx(i) 互换。因此,给定关于 Hk 的更新公式,交换 Δg(i) Δx(i) 的位置,并将 Hk 替换为 Bk ,就可以得到 Bk 的更新公式。
    在BFGS算法中,矩阵 Bk 对应着DFP算法的 Hk .满足这两种结构的两类公式称为对偶或互补的。
    已知DFP算法中关于 Hk ,即hessian矩阵逆矩阵的近似矩阵的更新公式为:
HDFPk+1=Hk+Δx(k)Δx(k)TΔx(k)TΔg(k)HkΔg(k)Δg(k)THkΔg(k)HkΔg(k)T

利用互补概念,可以得到 Bk ,即hessian矩阵的近似矩阵为:
Bk+1=Bk+Δg(k)Δg(k)TΔg(k)TΔx(k)BkΔx(k)Δx(k)TBkΔx(k)BkΔx(k)T

为了获得hessian矩阵逆矩阵的近似矩阵的更新公式,只需对矩阵 Bk+1 求逆即可。

二、谢尔曼——莫里森公式

    
引理 如果矩阵 A 非奇异, u v 是列向量, 满足 1+vTA1u0 , 那么 A+uvT 非奇异,其逆矩阵可以用 A1 表示,如下:

(A+uvT)1=A1(A1u)(vTA1)1+vTA1u

对应 Bk+1 应用2次引理, 可得:
HBFGSk+1=Hk+(1+Δg(k)THkΔg(k)Δg(k)TΔx(k))Δx(k)Δx(k)TΔx(k)TΔg(k)HkΔg(k)Δx(k)T+(HkΔg(k)Δx(k)T)TΔg(k)TΔx(k)

这就是BFGS算法中关于 Bk 的更新公式。BFGS算法保持了拟牛顿法的一切性质,包括共轭方向的性质,也能够使得近似矩阵一直保持正定。
    当迭代过程中一维搜索的精度不够高时,BFGS算法仍然比较稳健。这一性质有助于将计算资源从追求高精度的一维搜索中释放出来。就效率而言,BFGS算法要远超DFP算法。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最速下降算法: 最速下降法是一种基本的迭代算法,也叫做梯度下降法。该算法通过不断地朝着函数的梯度方向进行搜索,来找到函数的最小值。 在MATLAB中,可以使用fminunc函数来实现最速下降算法: ```matlab options = optimoptions('fminunc','Algorithm','quasi-newton','Display','iter'); x0 = [1;1]; fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; [x,fval] = fminunc(fun,x0,options); ``` 其中,options参数用于设置算法选项,x0是初始点,fun是目标函数,[x,fval]为最优解和最优值。 阻尼牛顿法: 阻尼牛顿法是一种基于牛顿法的迭代算法,旨在解决牛顿法中Hessian矩阵可能不正定导致算法无法收敛的问题。该算法采用了阻尼因子来控制步长,从而避免了牛顿法中可能出现的问题。 在MATLAB中,可以使用fminunc函数来实现阻尼牛顿法: ```matlab options = optimoptions('fminunc','Algorithm','trust-region','HessianFcn','objective','Display','iter'); x0 = [1;1]; fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; [x,fval] = fminunc(fun,x0,options); ``` 其中,options参数用于设置算法选项,HessianFcn参数用于设置Hessian矩阵的计算方法,objective表示使用目标函数计算Hessian矩阵,x0是初始点,fun是目标函数,[x,fval]为最优解和最优值。 BFGS方法: BFGS方法是一种基于梯度的优化算法,用于寻找目标函数的最小值。该算法通过不断地更新近似的Hessian矩阵来进行迭代,从而找到最优解。 在MATLAB中,可以使用fminunc函数来实现BFGS方法: ```matlab options = optimoptions('fminunc','Algorithm','quasi-newton','HessUpdate','bfgs','Display','iter'); x0 = [1;1]; fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; [x,fval] = fminunc(fun,x0,options); ``` 其中,options参数用于设置算法选项,HessUpdate参数用于设置Hessian矩阵的更新方法,bfgs表示使用BFGS方法,x0是初始点,fun是目标函数,[x,fval]为最优解和最优值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值