固定学习速率的梯度下降法MATLAB实例

       对于一个连续函数,其梯度方向是其函数值增加最快的方向,其梯度反方向是其函数值减小最快的方向,可以对于凸函数(可以理解为只有一个极值点,极值点就是最值点,而非凸函数有多个极值点),通过设定一个初始点,使其沿着负梯度方向每次移动一定的距离到下一个点,以迭代的方式部段进行下去,通过设定最大迭代次数以及梯度的二范数(摸)的最小值来终止迭代,可使得函数fx,y收敛到最小值或其附近。

以函数为例,以梯度下降法求此函数最小值,通过观察函数,为函数的最小值点,最小值为0。以(0,0)为起始点,学习率为0.01,设定最大迭代次数为1000或梯度的摸等于0.000001时结束迭代。matlab代码如下:

syms X Y Z x y;
x=0;y=0;   %初始点位置
k=0;lr=0.01;e=0.000001;  %k:迭代次数,设定最大迭代次数为1000次。lr:学习速率(这里采用固定学习速率)。e:梯度摸的最小值
sign=1;     %迭代终止的指标
Z=((X-1)^2)+((Y-1)^2);   %函数
P=[diff(Z,X) diff(Z,Y)];  %偏导数
A=zeros(4,1000);  %用来记录每次迭代生成的x,y,迭代次数k,以及每个迭代点的梯度的模
P0=subs(P,X,x);%计算在初始点是否满足迭代终止条件
P0=subs(P0,Y,y);
E0=double(norm(P0));
if(E0 <= e)
     sign=0;
     A0=[x y 0 E0];%如果初始点就是极值点,A0即为在初始点的x,y,迭代次数,以及每初始点梯度的模
   else
     sign=1;
   end
>> while(sign == 1)
        p=subs(P,X,x);%将x代入偏导数函数中
        p=subs(p,Y,y);%将y代入,得到梯度;
        x=x-(lr*p(1));%沿梯度反方向x的新值
        y=y-(lr*p(2));%沿梯度反方向y的新值
        k=k+1;%迭代次数+1
        p=subs(P,X,x);%将新值x代入偏导数函数中
        p=subs(p,Y,y);%将新值y代入,得到梯度
        E=double(norm(p));%计算迭代后该点的梯度的模
        A(:,k)=[x y E k]';%输出该点的x,y,迭代次数,以及该点梯度的模
        if((k>=1000)|(E<=e))  %迭代终止
           sign=0;
        else
           sign=1;
        end
    end

你可能感兴趣的:(学习,matlab,python)