在matlab中實現梯度下降法


梯度下降法的原理,本文不再描述,請參閱其它資料。

梯度下降法函數function [k ender]=steepest(f,x,e),需要三個參數f、x和e,其中f為目標函數,x為初始點,e為終止誤差。輸出也為兩個參數,k表示迭代的次數,ender表示找到的最低點。

 

steepest.m:

function [k ender]=steepest(f,x,e)
%梯度下降法,f為目標函數(兩變量x1和x2),x為初始點,如[3;4]
syms x1 x2 m; %m為學習率
d=-[diff(f,x1);diff(f,x2)];  %分別求x1和x2的偏導數,即下降的方向
flag=1;  %循環標志
k=0; %迭代次數
while(flag)
    d_temp=subs(d,x1,x(1));      %將起始點代入,求得當次下降x1梯度值
    d_temp=subs(d_temp,x2,x(2)); %將起始點代入,求得當次下降x2梯度值
    nor=norm(d_temp); %范數
    if(nor>=e)
        x_temp=x+m*d_temp;            %改變初始點x的值
        f_temp=subs(f,x1,x_temp(1));  %將改變后的x1和x2代入目標函數
        f_temp=subs(f_temp,x2,x_temp(2));
        h=diff(f_temp,m);  %對m求導,找出最佳學習率
        m_temp=solve(h);   %求方程,得到當次m
        x=x+m_temp*d_temp; %更新起始點x
        k=k+1;
    else
        flag=0;
    end
end
ender=double(x);  %終點
end

 

調用示例1:

syms x1 x2;
f=(x1-2)^2+2*(x2-1)^2;
x=[1;3];
e=10^(-20);
[k ender]=steepest(f,x,e)

結果:

k =

    27


ender =

     2
     1


調用示例2:

syms x1 x2;
f=x1-x2+2*x1^2+2*x1*x2+x2^2;
x=[0;0];
e=10^(-20);
[k ender]=steepest(f,x,e)

結果:

k =

    58


ender =

   -1.0000
    1.5000


調用示例3:

syms x1 x2;
f=3/2*x1^2+1/2*x2^2-x1*x2-2*x1;
x=[0;0];
e=10^(-2);
[k ender]=steepest(f,x,e)


結果:

k =

     9


ender =

    0.9959
    0.9877

 


免責聲明!

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



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