zoukankan      html  css  js  c++  java
  • 变步长梯度下降法

    关于最优化算法的框架见
    最优化算法确定迭代步长【线搜索技术】

    迭代公式(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. 和其他算法比较,收敛速度较慢。
    坚持
  • 相关阅读:
    Python Day14
    Python Day13
    Python Day12
    Python Day11
    Python Day10
    Python Day9
    Python Day8
    Python Day7
    Python Day6
    Python Day5
  • 原文地址:https://www.cnblogs.com/liudianfengmang/p/13443343.html
Copyright © 2011-2022 走看看