變步長梯度下降法


關於最優化算法的框架見
最優化算法確定迭代步長【線搜索技術】

迭代公式\(x_{k+1}=x_k+\alpha_kd_k\)
其中\(\alpha_k\)為第k次迭代步長,\(d_k\)為第k次迭代方向;

變步長梯度下降法就是每次迭代,步長都需要計算
定步長梯度下降發每次步長都為定值;算法見
最優化算法【最小二乘法和梯度下降法(固定步長)】

關於步長的確定,本算法采用非精確線搜索的Armijo准則

示例函數

\[f(x_1,x_2)=100(x_1^2-x_2^2)^2+(x_1-1)^2 \]

求極小值

matlab代碼

function [x,val,LOOS_t] = c_gradientDescent(func,gfunc,x0,iterate)
%c_gradientDescent - 變步長梯度下降法
%
% Syntax: [R,LOOS_t] = c_gradientDescent(func,gfunc,x0)
%
% R為所求極值點和極值矩陣,LOOS_t為迭代過程,函數值變�?

    maxk=iterate;
    LOOS_t=zeros(1,maxk);
    rho=0.5;Sigma=0.3;
    k=0;epsilon=1e-5;

    while k<maxk
        g=gfunc(x0);
        d=-g;

        if norm(d)<epsilon
            break;
        end
        m=0;mk=0;
        while m<20
            if func(x0+rho^m*d)<func(x0)+Sigma*rho^m*g'*d
                mk=m;
                break;
            end
            m=m+1;
        end     
        x0=x0+rho^mk*d;
        k=k+1;
        LOOS_t(1,k)=func(x0);
%         disp(x0);
    end
    x=x0;
    val=func(x0);
end

main函數代碼

clc;
close all;
iterate=20;
func=@(x) 100*(x(1)^2-x(2))^2+(x(1)-1)^2;
gfunc=@(x) [400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
x0=[-1.2,1]';
[x,val,LOOS_t] = c_gradientDescent(func,gfunc,x0,iterate);
disp(x);
disp(val);
figure(1);
plot(1:iterate,LOOS_t);

u=linspace(0,2,100);
v=linspace(0,2,100);
[uu,vv]=meshgrid(u,v);
ww=100*(uu.^2-vv).^2+(uu-1).^2;
figure(2);
mesh(uu,vv,ww);
set(get(gca, 'XLabel'), 'String', 'x1');
set(get(gca, 'YLabel'), 'String', 'x2');
set(get(gca, 'ZLabel'), 'String', 'f(x1,x2)');
[xx,min_f]=fmincon(func,x0,[],[],[],[],[0;0],[2;2]);
hold on;
plot3(xx(1),xx(2),min_f,'rp','MarkerSize',20);
text(xx(1),xx(2),min_f,['(',num2str(xx(1)),',',num2str(xx(2)),',',num2str(min_f),')'],'color','r');

效果

函數值隨迭代變化

Image

matlabfmincon函數計算結果及函數圖像

Image

conclusion

  1. 此算法計算結果和matlab函數計算結果相同,精度較高;
  2. 和其他算法比較,收斂速度較慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM