基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)
基于二阶矩阵的优化问题(一)线搜索策略
- 非精确线搜索更新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+αkpk
这是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+21pT∇2fkp
在这里,我们要假设这里的二次型(∇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的形式,这边我们只需要求解一个线性方程组即可。
以上为牛顿法的基础理论,下面看一下牛顿法的实现步骤:
可以看到,牛顿法的意义在于足够靠近真解时的快速收敛,我们先走几部最速下降法,使得足够靠近阈值,后再启动牛顿法,会有较好的效果,即保证了算法的效率,有保证了算法的鲁棒性。
下面是最速下降法+牛顿法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_kBkpk=−∇fk
xk+1=xk+αkpkx_{k+1}=x_k+α_kp_kxk+1=xk+αkpk(其中αkα_kαk在wolfe条件时可以取1)
end
好了,现在我们需要解决四件事,就可以实现修正牛顿法的运用:
1.判定∇2fk\nabla^2 f_k∇2fk是否正定;
2.解方程组Bkpk=−∇fkB_kp_k=-\nabla f_kBkpk=−∇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_kIEkI,使得其正定。
首先,我们对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代码)相关推荐
- 【SVM分类】基于人工蜂群算法优化支持向量机SVM实现数据分类附Matlab代码
1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...
- 【SVM分类】基于粒子群算法优化支持向量机实现葡萄酒数据分类附matlab代码
1 简介 在机器学习领域,要处理的数据的规模越来越大,而学习算法在数据的特征过多的时候,往往会产生性能上的下降.作为解决这个问题的有效手段,特征选择一直以来都得到了广泛的关注.粒子群优化算法作为一种优 ...
- 【预测模型-BP分类】基于人工蜂群算法优化BP神经网络实现数据分类附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 优化切尔诺贝利灾难模型——附matlab代码
优化切尔诺贝利灾难模型--附matlab代码 切尔诺贝利核电站事故是人类历史上最严重的核事故之一,对环境和人类健康造成了极大的影响.针对这样的事故,科学家们开发了许多模型用于预测和优化应对措施.本文将 ...
- 【图像分割】基于计算机视觉实现视网膜图像中的血管分割附matlab代码
1 简介 视网膜图像里的血管是可以被观察到的一类微血管,并且它是无创伤的,而其分布位置也属于深度部位[5].其分布.结构和形态特征的变化能在一定程度上反映病变的程度.而白血病.糖尿病以及高血压等疾病都 ...
- 智能优化算法-蚁狮优化器Ant Lion Optimizer(附Matlab代码)
引言 蚁狮优化器(Ant Lion Optimizer,ALO)模拟了自然界蚁狮的捕猎机制.实施了蚁群随机行走.设置陷阱.设陷阱.捕捉猎物.重建陷阱等5个主要捕猎步骤.于2015年发表在Seyedal ...
- 【智能优化算法】基于全局优化的改进鸡群算法求解单目标优化问题(ECSO)附matlab代码
1 简介 智能算法分为两种,一种是群体智能算法(swarmintelligencealgorithm),该算法大多模拟自然界中动植物的特有行为,并将其表达成数学语言,从而进行迭代寻优,如模拟蝙蝠回声定 ...
- 【故障诊断】基于贝叶斯优化支持向量机的轴承故障诊断附matlab代码
1 内容介绍 贝叶斯网络(Bayesian Network或BN)是人工智能领域进行建模和不确定性推理的一个有效工具.贝叶斯网推理的基本任务是:给定一组证据变量观察值,通过搜索条件概率表计算一组查询变 ...
- 【信号去噪】基于鲸鱼算法优化VMD实现信号去噪附matlab代码
1 内容介绍 一种基于WOAVMD算法的信号去噪方法,具体为:根据鲸鱼优化算法分别建立目标包围,发泡网攻击以及猎物搜寻的数学模型,然后进行初始化参数,在取值范围内初始化鲸鱼的位置向量,根据位置向量对原 ...
- 【信号去噪】基于鲸鱼优化算法优化VMD实现数据去噪附matlab代码
1 内容介绍 一种基于WOAVMD算法的信号去噪方法,具体为:根据鲸鱼优化算法分别建立目标包围,发泡网攻击以及猎物搜寻的数学模型,然后进行初始化参数,在取值范围内初始化鲸鱼的位置向量,根据位置向量对原 ...
最新文章
- php缓存数据到本地缓存,本地缓存localStorage的使用方法
- 【 MATLAB 】xcorr 函数介绍(互相关)简介
- Python工具包werkzeug
- python实现监控增量_Python 快速计算增量的方法
- centos7 kickstart 使用小结
- 【附答案】Java面试2019常考题目汇总(一)
- MySQL查询语句常用函数总结
- JSTL核心标签超详细
- 打代码太苦,你需要一个鼓励师
- 电离层对高分辨率星载SAR成像的影响1——电离层的相关定义
- ICC II setupfloorplan
- 一个“蝇量级” C 语言协程库 -- Protothreads
- STM32对ad9854进行频率步进(按键)
- 【QNX Hypervisor 2.2 用户手册】1.3 QNX hypervisor架构
- 《滕王阁序》古文鉴赏
- ubuntu16.04+七彩虹GTX1060的NVIDIA驱动+Cuda8.0+cudnn5.1+tensorflow+keras搭建深度学习环境【学习笔记】【原创】
- 《策略投资》第1、2章读书分享
- 为了防止女朋友怼我,我就先用python爬了3600个怼人表情包等她来战!
- PHP常用字符串函数32个(个人总结)
- 我这些年从来没有用过算法,除了出去面试的时候