梯度下降法 matlab實現


 

function [k ender]=steepest(f,x,e)

% f=x1-x2+2*x1^2+2*x1*x2+x2^2; 假設f等於
% x=[0;0];
% e=10^(-20);
syms x1 x2 m; %m為學習率
d=-[diff(f,x1);diff(f,x2)] %分別求x1和x2的偏導數,即下降的方向

% - 4*x1 - 2*x2 - 1
% 1 - 2*x2 - 2*x1

flag=1; %循環標志
k=0; %迭代次數


while(flag)
d_temp=subs(d,x1,x(1)) ; %分別對x1,x2求一階偏導數值
%先把x1帶入二階導函數
d_temp=subs(d_temp,x2,x(2)); %再把x2帶入1階導函數

%以上求出1階偏導數在x1,x2的函數值

nor=norm(d_temp)%范數 求出此時的偏導數范數

if(nor>=e) %因為在局部最優點偏導數接近0,所以拿來和誤差比較

x_temp=x+m*d_temp ; %改變初始點x的值
% 開始迭代x的路徑,而且此路徑和 該點到數值有關

f_temp=subs(f,x1,x_temp(1)); %將改變后的x1和x2代入目標函數

f_temp=subs(f_temp,x2,x_temp(2))
%分別把更新后的x1,x2帶代入 f

h=diff(f_temp,m) %代入含有rate m的x1,x2后的f 對m求導
%此時 是關於m的一元函數,g(m)與f不同,是由(x1,x2)處梯度和f 產生,找到g(m)的最小值,如果最小值不是梯度近似為0,則進行下一次迭代
m_temp=solve(h) ; %求方程,得到當次m 。找出極值
x=x+m_temp*d_temp ;%更新起始點x
%正式求出m並帶入 迭代x的方程,求出第二個點
k=k+1 %迭代次數更新
else
flag=0;
end
end
ender=double(x); %此時是滿足條件的更新后的 x
end

 

 

 

測試

syms x1 x2;
f=(x1-2)^2+2*(x2-1)^2;  %f可以為任意可微的函數
x=[1;3];
e=10^(-20);
[k ender]=steepest(f,x,e)


免責聲明!

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



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