最优化方法-共轭梯度法

1.简介

共轭梯度法最初由Hesteness和Stiefel于1952年为求解线性方程组而提出的。其基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜素,求出目标函数的极小点。根据共轭方向基本性质,这种方法具有二次终止性。

对于二次凸函数的共轭梯度法:
minf(x)=12XTAX+BTX+Cminf(x) = \frac{1}{2}X^TAX+B^TX+C minf(x)=21​XTAX+BTX+C

2.实例

用共轭梯度法求二次函数的极小值与极小点,设初值为[1,1],迭代精度为0.001
f(x1,x2)=x12+2x22−4x1−2x1x2f(x_1,x_2) = x^2_1+2x^2_2-4x_1-2x_1x_2 f(x1​,x2​)=x12​+2x22​−4x1​−2x1​x2​

A.计算偏导
▽f(x0)=[2x1−2x2−44x2−2x1]=[−42]\bigtriangledown f(x_0)=\quad \begin{bmatrix} 2x_1-2x_2-4\\4x_2-2x_1\end{bmatrix} \quad=\quad \begin{bmatrix} -4\\2\end{bmatrix} \quad ▽f(x0​)=[2x1​−2x2​−44x2​−2x1​​]=[−42​]
B.搜索最佳步长
xi=x0+a0▽f(x0)==[11]+a0[−42]=[1+4a01−2a0]f(xi)=min⁡af(xi)=min⁡a(40a−20a−3)a0=0.25,x1=[20.5],▽f(x1)=[−1−2]x_i=x_0+a_0\bigtriangledown f(x_0)=\quad=\quad \begin{bmatrix} 1\\1\end{bmatrix} \quad+a_0 \quad \begin{bmatrix} -4\\2\end{bmatrix} \quad= \quad \begin{bmatrix} 1+4a_0\\1-2a_0\end{bmatrix} \quad \\f(x_i)=\min\limits_{a}f(x_i)=\min\limits_{a}(40a-20a-3) \\ a_0=0.25,x_1=\quad \begin{bmatrix} 2\\0.5\end{bmatrix} \quad,\bigtriangledown f(x_1)= \begin{bmatrix} -1\\-2\end{bmatrix} \quad xi​=x0​+a0​▽f(x0​)==[11​]+a0​[−42​]=[1+4a0​1−2a0​​]f(xi​)=amin​f(xi​)=amin​(40a−20a−3)a0​=0.25,x1​=[20.5​],▽f(x1​)=[−1−2​]
C.第二次迭代
b0=∥▽f(x1)∥2∥▽f(x0)∥2=0.25s1=−▽f(x1)−b0▽f(x0)=[21.5]xi+1=xi+a▽f(xi)==[20.5]+a[21.5]=[2+2a0.5+1.5a]a=1.25,x2=[42],▽f(x2)=[00]∥▽f(x2)∥2=0<ξ收敛b_0= \frac{\parallel \bigtriangledown f(x_1)\parallel^2}{\parallel \bigtriangledown f(x_0)\parallel^2}=0.25 \\ s1=- \bigtriangledown f(x_1)-b_0\bigtriangledown f(x_0)=\quad \begin{bmatrix} 2\\1.5\end{bmatrix} \quad \\ x_{i+1}=x_i+a\bigtriangledown f(x_i)=\quad=\quad \begin{bmatrix} 2\\0.5\end{bmatrix} \quad+a \quad \begin{bmatrix} 2\\1.5\end{bmatrix} \quad= \quad \begin{bmatrix} 2+2a\\0.5+1.5a\end{bmatrix} \quad \\ a=1.25,x_2=\quad \begin{bmatrix} 4\\2\end{bmatrix} \quad,\bigtriangledown f(x_2)= \begin{bmatrix} 0\\0\end{bmatrix} \quad \\ \parallel \bigtriangledown f(x_2)\parallel^2=0<\xi收敛 b0​=∥▽f(x0​)∥2∥▽f(x1​)∥2​=0.25s1=−▽f(x1​)−b0​▽f(x0​)=[21.5​]xi+1​=xi​+a▽f(xi​)==[20.5​]+a[21.5​]=[2+2a0.5+1.5a​]a=1.25,x2​=[42​],▽f(x2​)=[00​]∥▽f(x2​)∥2=0<ξ收敛

3.Matlab代码

二元问题

clc
clear
close all;
syms xi yi;
func = xi^2+2*yi^2-4*xi-2*xi*yi;%创建符号表达式f
f=conjugate_grad_2d(func,[1,1],0.001);function f = conjugate_grad_2d(func,x0,t)
%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点
%已知初始点坐标:x0
%已知收敛精度:t
%求的已知函数的极值:f
x=x0;
syms xi yi a;%定义自变量,步长为符号变量
% func = xi^2+2*yi^2-4*xi-2*xi*yi;%创建符号表达式f
fx=diff(func,xi);%求表达式的偏导数
fy=diff(func,yi);
dxv=subs(fx,{xi,yi},x);%代入初值计算当前点做多对xi的一阶偏导实值
dyv=subs(fy,{xi,yi},x);fi=[dxv,dyv];%初始点梯度向量
count=0;%搜索次数初始值
while double(sqrt(dxv^2+dyv^2))>t%搜素精度不满足已知条件if count<=0 %第一次搜索的方向为负梯度方向ds=-fi;elseds=s1;%第二次搜索方向为-fii+d*s;endx=x+a*ds;%进行一次搜索后的点坐标func_a=subs(func,{xi,yi},x);%构造一元函数φ(a),计算步长fda=diff(func_a);%对函数求导dav=solve(fda);%得到最佳步长aif dav~=0if length(dav)>1ai=double(dav(1));elseai=double(dav);end    elsebreak;%若点a=0,则直接跳出循环,此点为极值end%计算下一步梯度x=subs(x,a,ai);%下一步点坐标dfxiv=subs(fx,{xi,yi},x);%代入初值计算当前点做多对xi的一阶偏导实值dfyiv=subs(fy,{xi,yi},x);dfii=[dfxiv,dfyiv];%下一点梯度向量b0=(dfxiv^2+dfyiv^2)/(dxv^2+dyv^2);%s1=-dfii+b0*ds;%下一点搜索的方向向量count=count+1;%搜索次数+1dxv=dfxiv;dyv=dfyiv;
end
x,f=subs(func,{xi,yi},x),count%输出极值点,极小值以及搜索次数

三元问题

clc
clear
close all;
% syms xi yi;
% func = xi^2+2*yi^2-4*xi-2*xi*yi;%创建符号表达式f
% f=conjugate_grad_2d(func,[1,1],0.001);N=3;
X = sym('x', [1 N])';
% A = rand(N,N);
% B = rand(1,N);
% C = rand(1,N);
% func = X'*A*X +B*X + C;
syms x1 x2 x3;
func = x1^2+2*x2^2+x3^2;%创建符号表达式f-4*x1-2*x1*x2
f=conjugate_grad_2d_new(func,[1,1,1],0.000001);function f = conjugate_grad_2d_new(func,x0,t)
%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点
%已知初始点坐标:x0
%已知收敛精度:t
%求的已知函数的极值:f
x=x0;
syms x1 x2 x3 a;%定义自变量,步长为符号变量
% func = x1^2+2*x2^2-4*x1-2*x1*x2;%创建符号表达式f
fx=diff(func,x1);%求表达式的偏导数
fx2=diff(func,x2);
fx3=diff(func,x2);
dxv=subs(fx,{x1,x2,x3},x);%代入初值计算当前点做多对x1的一阶偏导实值
dx2=subs(fx2,{x1,x2,x3},x);
dx3=subs(fx3,{x1,x2,x3},x);fi=[dxv,dx2,dx2];%初始点梯度向量
count=0;%搜索次数初始值
while double(sqrt(dxv^2+dx2^2 + dx3^2))>t%搜素精度不满足已知条件if count<=0 %第一次搜索的方向为负梯度方向ds=-fi;elseds=s1;%第二次搜索方向为-fii+d*s;end%计算当前x的偏导值dxv=subs(fx,{x1,x2,x3},x);%代入初值计算当前点做多对x1的一阶偏导实值dx2=subs(fx2,{x1,x2,x3},x);dx3=subs(fx3,{x1,x2,x3},x);x=x+a*ds;%进行一次搜索后的点坐标func_a=subs(func,{x1,x2,x3},x);%构造一元函数φ(a),计算步长fda=diff(func_a);%对函数求导dav=solve(fda);%得到最佳步长aif dav~=0if length(dav)>1ai=double(dav(1));elseai=double(dav);endelsebreak;%若点a=0,则直接跳出循环,此点为极值end%计算下一步梯度x=subs(x,a,ai);%下一步点坐标dfx1v=subs(fx,{x1,x2, x3},x);%代入初值计算当前点做多对x1的一阶偏导实值dfx2v=subs(fx2,{x1,x2, x3},x);dfx3v=subs(fx3,{x1,x2, x3},x);dfii=[dfx1v,dfx2v,dfx3v];%下一点梯度向量b0=(dfx1v^2+dfx2v^2+dfx3v^2)/(dxv^2+dx2^2+dx3^2);%s1=-dfii+b0*ds;%下一点搜索的方向向量count=count+1;%搜索次数+1dxv=dfx1v;dx2=dfx2v;dx3=dfx3v;
end
f=subs(func,{x1,x2,x3},x)
double(x),double(f),count%输出极值点,极小值以及搜索次数%x:1.0e-07 *-0.2878    0.1271    0.1271
%f:1.3134e-15
%c:7

4.非线性共轭梯度

当目标函数是高于二次的连续函数(即目标函数的梯度存在)时,其对应的解方程是非线性方程,非线性问题的目标函数可能存在局部极值,并且破坏了二次截止性,共轭梯度法需要在两个方面加以改进后,仍然可以用于实际的反演计算,但共轭梯度法不能确保收敛到全局极值。
(1)首先是共轭梯度法不能在n维空间内依靠n步搜索到达极值点,需要重启共轭梯度法,继续迭代,以完成搜索极值点的工作。
(2)在目标函数复杂,在计算时,由于需要局部线性化,需计算Hessian矩阵A,且计算工作量比较大,矩阵A也有可能是病态的。
参考文献:
https://www.cnblogs.com/walccott/p/4956966.html
https://wenku.baidu.com/view/613e7216336c1eb91a375da4.html
https://wenku.baidu.com/view/19b537e164ce0508763231126edb6f1afe007173.html

最优化方法-共轭梯度法相关推荐

  1. 【Math】常见的几种最优化方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:poll 来源:https://www.cnblogs.co ...

  2. 共轭梯度下降法matlab,用matlab实现最速下降法,牛顿法和共轭梯度法求解实例

    用matlab实现最速下降法,牛顿法和共轭梯度法求解实例 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验的题目和要求 1.所属 ...

  3. 优化算法-共轭梯度法

     优化算法-共轭梯度法 (2012-04-20 08:57:05) 转载▼ 标签: 杂谈   最速下降法 1.最速下降方向 函数f(x)在点x处沿方向d的变化率可用方向导数来表示.对于可微函数,方 ...

  4. 运筹学(最优化理论)学习笔记 | 共轭梯度法

    最近博主复习了一下无约束问题最优化算法中的共轭梯度法.无约束问题最优化方法包括最速下降法.牛顿法.共轭梯度法.拟牛顿法等等.借用书中的一句话: 无约束优化问题的求解通过一系列一维搜索来实现.因此怎样选 ...

  5. 最优化评分法c语言,最优化方法及其实现(Optimization-Algorithm)C语言

    Optimization-Algorithm 优化算法--C语言 ##A Record for the Methods of Optimization.(优化算法--C语言) Author: Amoi ...

  6. 机器学习中导数最优化方法(基础篇)

    1. 前言 熟悉机器学习的童鞋都知道,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解无约束最优化问题.实现简单,coding 方便,是训练模型的必备利器之一.这 ...

  7. 常见的几种最优化方法

    参考:http://blog.csdn.NET/majinlei121/article/details/47260917 http://www.cnblogs.com/maybe2030/p/4751 ...

  8. **ML : ML中的最优化方法

    前言:         在机器学习方法中,若模型理解为决策模型,有些模型可以使用解析方法.不过更一般的对模型的求解使用优化的方法,更多的数据可以得到更多的精度.         AI中基于归纳的方法延 ...

  9. 机器学习基础:最优化方法

    本文先总结了凸函数.hessian矩阵.泰勒展开.拉格朗日乘子.对偶函数,随后介绍了最优化中常用的梯度下降法.牛顿法.共轭梯度法.线性搜索法.置信域方法,最后介绍了其他的一些流行的最优化方法,模拟退火 ...

最新文章

  1. 《再不疯狂,我们就老了》 -- [澳]塞巴斯蒂安·特里
  2. 宁波大学计算机网络实验五,宁波大学计算机网络实验答案.doc
  3. Ajax框架及原理分析--视频
  4. Java技术分享:升级所安装Java版本的两种方式
  5. 建立域信任关系后,查找位置中看不到另一个域的信息
  6. 《皇帝新脑》读书笔记(一)
  7. Python开心消消乐源代码
  8. 机器视觉全球顶级实验室
  9. 我的c盘为多余的java.exejavaw.exe_java.exe,javac.exe,javaw.exe 是什么进程?
  10. openssl的部分使用例子
  11. R语言(五) Plotly绘图基本命令介绍
  12. spss python_ARIMA模型 - [SPSS Python]
  13. 一度智信:拼多多探路知识普惠
  14. iKinds:我是如何一步步重构改造项目从单VC到多VC界面(上)
  15. python pdf报告_利用python设计PDF报告,jinja2,whtmltopdf,matplotlib,pandas
  16. 前端面试题 —— HTML
  17. 回发或回调参数无效 的解决办法
  18. 软件新产品开发失败原因分析
  19. 《三、企业级SVN运维实战:SVN服务配置https访问》
  20. CCF推荐的中文期刊

热门文章

  1. 论文写作-题目怎么取
  2. IsBackground前台线程与后台线程的区别
  3. wince 6.0 注册表
  4. python中二进制转8进制_Python-八进制、二进制互转换
  5. undo_retention:确定最优的撤销保留时间
  6. C语言里怎么输出6位以上的小数
  7. 如何发布web网站(一)
  8. 最先进的微型计算机,获得《微型计算机》称赞,GPD P2 MAX堪称对便携本的终极追求...
  9. 二级联动省市mysql数据库_「zxfy」jQuery+php+mysql,轻松实现ajax无刷新省市二级联动 - seo实验室...
  10. php中文网线上视频,看php中文网视频课程的正确姿势!