基于二阶矩阵的优化问题(一)线搜索策略

  • 非精确线搜索更新Xk+1X_{k+1}Xk+1​
    • 线搜索策略
      • 最速下降+牛顿法
        • 启发
      • 修正牛顿法
        • 特征值修正(eigenvalue modification)
          • 谱分解
        • 单位增量法
      • 拟牛顿法

非精确线搜索更新Xk+1X_{k+1}Xk+1​

优化算法的问题在于如何从XkX_kXk​更新到Xk+1X_{k+1}Xk+1​、确定步长公式详见 基于二阶矩阵的优化问题(二)和判定迭代终止的条件(详见 于二阶矩阵的优化问题(三))是我们需要在不精确搜索中解决的问题。
我们有两种方法来解决这个问题:
1.线搜索策略
2.信任域策略

线搜索策略

我们选择一个下降方向来使得lost function慢慢迭代至最小值。

Xk+1=Xk+αkpkX_{k+1}=X_k+α_kp_kXk+1​=Xk​+αk​pk​

这是Xk+1X_{k+1}Xk+1​的更新公式,可以看到,我们需要知道其αkα_kαk​和pkp_kpk​的值才能进行迭代(αkα_kαk​代表了步长、pkp_kpk​代表下降方向),第一种方法就是pkp_kpk​走一个最速下降方向(负梯度),而αkα_kαk​走一个极其猥琐的距离,但这种方法在函数比较诡异时效果较差(如rosenbrock函数),但在某些复杂问题时,我们还是使用最速下降来解决问题,详见 大规模的优化问题(一)

最速下降+牛顿法

让我们来列一下牛顿方向的式子:

f(xk+p)≈fk+pT∇fk+12pT∇2fkpf(x_k+p)\approx f_k+p^T\nabla f_k+\frac{1}{2}p^T\nabla^2f_kpf(xk​+p)≈fk​+pT∇fk​+21​pT∇2fk​p

在这里,我们要假设这里的二次型(∇2fk\nabla^2 f_k∇2fk​)是正定的,这是函数的局部二次型构型就是碗状的,我们可以求出这里的pk(下降方向):

pKN=−(∇2fk)−1∇fkp^N_K=-(\nabla^2f_k)^{-1}\nabla f_kpKN​=−(∇2fk​)−1∇fk​;

这边的pKNp^N_KpKN​就是这里的局部二次型的顶点,在牛顿法中,我们可以一步就走到这个点。
ok,这个问题的理论情况是这样的,但在实际问题中,我们不可能去求一个hessian矩阵的逆矩阵,所以,我们把1/(∇2fk)1/(\nabla^2f_k)1/(∇2fk​)移到等式的左边,变成:

pKN∗(∇2fk)=−∇fkp^N_K*(\nabla^2f_k)=-\nabla f_kpKN​∗(∇2fk​)=−∇fk​,

这个等式实际上就等于Ax=b的形式,这边我们只需要求解一个线性方程组即可。
以上为牛顿法的基础理论,下面看一下牛顿法的实现步骤:

Created with Raphaël 2.3.0开始最速下降▽fk<阈值转到Newtonyesno

可以看到,牛顿法的意义在于足够靠近真解时的快速收敛,我们先走几部最速下降法,使得足够靠近阈值,后再启动牛顿法,会有较好的效果,即保证了算法的效率,有保证了算法的鲁棒性。

下面是最速下降法+牛顿法matlab实现的代码:

function [x1] = min_hybrid(func, dfunc, d2func ,x, MAX_IT ,eps, threshold)err = 10.0;steps = 0;alpha = 1.0;//最速下降法while (err > threshold)//此处阈值需要调参f = func(x);g = dfunc(x);p = -g;step=step+1;alpha = backtracking(@func, x, f, g, p, 1e-4, 0.8, alpha * 2.0);x = x + alpha * p;if (steps > MAX_IT)break;enderror = norm(g);end//牛顿法while (error > eps)f = func(x);g = dfunc(x);G = d2func(x);p = -G\g;x = x + p;step=step+1;if (steps > MAX_IT)break;enderror = norm(g);endx1=x;
endfunction alpha = backtracking(func, x, f, df, p, c, rho, alpha0)alpha = alpha0;while (func(x(1) + alpha * p(1), x(2) + alpha * p(2)) > f + c * alpha * df' * p)alpha = alpha * rho;end
end

其中func、gfunc和hess需要自行解析计算,func的接口只有x,gfunc和hess没有输入参数。(这边要注意,使用wolfe条件时,alpha可以恒取1)

启发

牛顿法实际上是在改进真解,用少量次数的迭代即可实现一阶方法上千次的迭代效果,首先系数矩阵必须要正定,否则牛顿法不能保证收敛。

修正牛顿法

牛顿法最大的问题在于,系数矩阵必须要正定,那么如果系数矩阵不正定,则将BkB_kBk​改成正定(modification),下面是修改系数矩阵的算法框架:

初值x0x_0x0​
for k=0,1,2,…
        令 Bk=∇2fk+EkB_k=\nabla^2 f_k+E_kBk​=∇2fk​+Ek​,其中EkE_kEk​为修正项,使得BkB_kBk​充分正定。
        求解 Bkpk=−∇fkB_kp_k=-\nabla f_kBk​pk​=−∇fk​
        xk+1=xk+αkpkx_{k+1}=x_k+α_kp_kxk+1​=xk​+αk​pk​(其中αkα_kαk​在wolfe条件时可以取1)
end

好了,现在我们需要解决四件事,就可以实现修正牛顿法的运用:
1.判定∇2fk\nabla^2 f_k∇2fk​是否正定;
2.解方程组Bkpk=−∇fkB_kp_k=-\nabla f_kBk​pk​=−∇fk​;
3.如何构建EkE_kEk​;
4.如何使得∣∣Ek∣∣\vert\vert E_k\vert\vert∣∣Ek​∣∣最小;

特征值修正(eigenvalue modification)

谱分解

首先我们先对对称矩阵BkB_kBk​做正交分解(householder等),得到正交阵Q,和对角阵V,然后就可以得到BkB_kBk​的所有特征值,我们知道,正定矩阵所有的特征值都是充分大的正数,即λmin>δ>>eps>0λ_{min}>δ>>eps>0λmin​>δ>>eps>0,当出现负的特征值时,我们添加一个修正项EkE_kEk​使得特征值大于等于δ。此时的∣∣Ek∣∣\vert\vert E_k\vert\vert∣∣Ek​∣∣的Frobenius范数最小。
即用Matlab中的eig()函数求出特征值后,直接对特征值修改即可。

单位增量法

谱分解的问题在于,其真正改变的是特征值,所以对BkB_kBk​的改动是比较的,当我们不希望BkB_kBk​发生很大的变动时,我们就使用单位增量法。单位增量法直接对BkB_kBk​添加一个修正项EkIE_kIEk​I,使得其正定。
首先,我们对BkB_kBk​进行cholesky分解:

Bk=LDLTB_k=LDL^TBk​=LDLT

L是对角线均为1的下三角阵,D为对角阵,若BkB_kBk​不定,D的对角元diid_{ii}dii​会过大。
下面是单位增量法的Matlab代码:

function[L,D]=modification(A,delta,beta)if(norm(A-A')>epsreturn;endn=size(A,1);d=zero(n,1);L=zero(n);C=zero(n);theta=zeros(n,1);for j = 1:nC(j,j) = A(j,j)-sum(d(1:j-1)'.*L(j,1:j-1).^2);for i = j+1:nC(i,j) = A(i,j)-sum(d(1:j-1)'.*L(i,1:j-1).*L(j,1:j-1));absjj=abs(C(i,j));if theta < abs(C(i,j))theta = abs(C(i,j));endendd(j) = max([abs(C(j,j)), (theta/beta)^2, \delta]);for i = j+1:nL(i,j) = C(i,j)/d(j);endL(j,j) = 1.0;endD=diag(d);
end

单位增量法得到的BkB_kBk​和Bk+EkB_k+E_kBk​+Ek​在形式上很接近,但其特征值完全不同,所以两种方法各有优势,可根据情况自行选择。

拟牛顿法

如果你的数据维数过大或者无法承受计算二阶矩阵的消耗,这边也可以使用拟牛顿法来计算下降方向,当然拟牛顿法也有其缺陷,下面我们来分析一下。
首先我们介绍一下割线法,用弦的斜率近似代替目标函数的切线斜率,下面给出割线法的公式

xk+1=xk−f(xk)∗xk−1−xkf(xk−1)−f(xk)x_{k+1}=x_k-f(x_k)*\frac{x_{k-1}-x_k}{f(x_{k-1})-f(x_k)}xk+1​=xk​−f(xk​)∗f(xk−1​)−f(xk​)xk−1​−xk​​

这在本质上是计算函数的数值微分,但这种方法在接近收敛时会出现数值不稳定的情况,当接近收敛时,舍入误差占比变大,数值会发生很大的起伏变化。
由此我们可以推导出拟牛顿法的公式

xk+1=xk−∇f(xk)∗xk−1−xk∇f(xk−1)−∇f(xk)x_{k+1}=x_k-\nabla f(x_k)*\frac{x_{k-1}-x_k}{\nabla f(x_{k-1})-\nabla f(x_k)}xk+1​=xk​−∇f(xk​)∗∇f(xk−1​)−∇f(xk​)xk−1​−xk​​

这里不在需要计算其hessian矩阵,由于hessian矩阵是n2n^2n2级别的,拟牛顿法对于大规模问题来说是非常节约资源的方法

于是我们知道了

∇2f(xk)∗(xk+1−xk)≈∇fx+1−∇fk\nabla ^2f(x_k)*(x_{k+1}-x_k)\approx\nabla f_{x+1}-\nabla f_k∇2f(xk​)∗(xk+1​−xk​)≈∇fx+1​−∇fk​

现在的情况与牛顿发不同,∇f(xk)\nabla f(x_k)∇f(xk​)并不知道,这是一个不定方程组:

Bk+1∗sk=ykB_{k+1}*s_k=y_kBk+1​∗sk​=yk​

这里的Bk+1B_{k+1}Bk+1​是n2n^2n2阶的矩阵,而我们只有n个方程,下面有SR1、BFGS等方法来求解Bk+1B_{k+1}Bk+1​。
详见 拟牛顿法的下降方向计算(一)
此时,局部二次型的pKNp_K^NpKN​方程变为

pKN=−(Bk)−1∇fkp^N_K=-(B_k)^{-1}\nabla f_kpKN​=−(Bk​)−1∇fk​;

这里还有一条路,就是去构建(Bk)−1(B_k)^{-1}(Bk​)−1,这时我们不需要再去求解线性方程组(这里设Hk=(Bk)−1H_k=(B_k)^{-1}Hk​=(Bk​)−1),这里BkB_kBk​=I时,就是最速下降。

pk=−Hk∗∇fkp_k=-H_k*\nabla f_kpk​=−Hk​∗∇fk​

这里有拟BFGS等方法来求解HkH_kHk​,详见 拟牛顿法的下降方向计算(二)

github代码地址

基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)相关推荐

  1. 【SVM分类】基于人工蜂群算法优化支持向量机SVM实现数据分类附Matlab代码

    1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...

  2. 【SVM分类】基于粒子群算法优化支持向量机实现葡萄酒数据分类附matlab代码

    1 简介 在机器学习领域,要处理的数据的规模越来越大,而学习算法在数据的特征过多的时候,往往会产生性能上的下降.作为解决这个问题的有效手段,特征选择一直以来都得到了广泛的关注.粒子群优化算法作为一种优 ...

  3. 【预测模型-BP分类】基于人工蜂群算法优化BP神经网络实现数据分类附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  4. 优化切尔诺贝利灾难模型——附matlab代码

    优化切尔诺贝利灾难模型--附matlab代码 切尔诺贝利核电站事故是人类历史上最严重的核事故之一,对环境和人类健康造成了极大的影响.针对这样的事故,科学家们开发了许多模型用于预测和优化应对措施.本文将 ...

  5. 【图像分割】基于计算机视觉实现视网膜图像中的血管分割附matlab代码

    1 简介 视网膜图像里的血管是可以被观察到的一类微血管,并且它是无创伤的,而其分布位置也属于深度部位[5].其分布.结构和形态特征的变化能在一定程度上反映病变的程度.而白血病.糖尿病以及高血压等疾病都 ...

  6. 智能优化算法-蚁狮优化器Ant Lion Optimizer(附Matlab代码)

    引言 蚁狮优化器(Ant Lion Optimizer,ALO)模拟了自然界蚁狮的捕猎机制.实施了蚁群随机行走.设置陷阱.设陷阱.捕捉猎物.重建陷阱等5个主要捕猎步骤.于2015年发表在Seyedal ...

  7. 【智能优化算法】基于全局优化的改进鸡群算法求解单目标优化问题(ECSO)附matlab代码

    1 简介 智能算法分为两种,一种是群体智能算法(swarmintelligencealgorithm),该算法大多模拟自然界中动植物的特有行为,并将其表达成数学语言,从而进行迭代寻优,如模拟蝙蝠回声定 ...

  8. 【故障诊断】基于贝叶斯优化支持向量机的轴承故障诊断附matlab代码

    1 内容介绍 贝叶斯网络(Bayesian Network或BN)是人工智能领域进行建模和不确定性推理的一个有效工具.贝叶斯网推理的基本任务是:给定一组证据变量观察值,通过搜索条件概率表计算一组查询变 ...

  9. 【信号去噪】基于鲸鱼算法优化VMD实现信号去噪附matlab代码

    1 内容介绍 一种基于WOAVMD算法的信号去噪方法,具体为:根据鲸鱼优化算法分别建立目标包围,发泡网攻击以及猎物搜寻的数学模型,然后进行初始化参数,在取值范围内初始化鲸鱼的位置向量,根据位置向量对原 ...

  10. 【信号去噪】基于鲸鱼优化算法优化VMD实现数据去噪附matlab代码

    1 内容介绍 一种基于WOAVMD算法的信号去噪方法,具体为:根据鲸鱼优化算法分别建立目标包围,发泡网攻击以及猎物搜寻的数学模型,然后进行初始化参数,在取值范围内初始化鲸鱼的位置向量,根据位置向量对原 ...

最新文章

  1. php缓存数据到本地缓存,本地缓存localStorage的使用方法
  2. 【 MATLAB 】xcorr 函数介绍(互相关)简介
  3. Python工具包werkzeug
  4. python实现监控增量_Python 快速计算增量的方法
  5. centos7 kickstart 使用小结
  6. 【附答案】Java面试2019常考题目汇总(一)
  7. MySQL查询语句常用函数总结
  8. JSTL核心标签超详细
  9. 打代码太苦,你需要一个鼓励师
  10. 电离层对高分辨率星载SAR成像的影响1——电离层的相关定义
  11. ICC II setupfloorplan
  12. 一个“蝇量级” C 语言协程库 -- Protothreads
  13. STM32对ad9854进行频率步进(按键)
  14. 【QNX Hypervisor 2.2 用户手册】1.3 QNX hypervisor架构
  15. 《滕王阁序》古文鉴赏
  16. ubuntu16.04+七彩虹GTX1060的NVIDIA驱动+Cuda8.0+cudnn5.1+tensorflow+keras搭建深度学习环境【学习笔记】【原创】
  17. 《策略投资》第1、2章读书分享
  18. 为了防止女朋友怼我,我就先用python爬了3600个怼人表情包等她来战!
  19. PHP常用字符串函数32个(个人总结)
  20. 我这些年从来没有用过算法,除了出去面试的时候

热门文章

  1. 微信小程序——视图层
  2. win10输入法变成繁体字的快捷键
  3. 中国裁判文书网全网最新爬虫分析
  4. neural-style风格迁移模型实战
  5. 教你STM32官方开发板原理图下载
  6. 详解 Redis 中布隆过滤器解决缓存穿透问题
  7. java项目根目录_获取java项目的根目录
  8. RFID工作原理(图)及标签分类(按供电方式)
  9. Android音频的录制与播放
  10. python求小于n的最大素数_找出小于n的最大素数,其中n =〜10 ^ 230 - python