梯度演算法的Matlab實現

2022-08-19 22:12:14 字數 1974 閱讀 4596

一、通過乙個例子來看梯度下降法是怎麼算的

函式,求解其最小值

1.求解梯度函式

2.給定初始點,計算出該點的梯度,開始迭代

3.計算初始點梯度模,判斷是否滿足終止條件

,如果滿足,得到終點。如果不滿足,求得當前最優的學習率,然後迭代。

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

% 梯度下降法函式function [k ender]=steepest(f,x,e),需要三個引數f、x和e,其中

% f為目標函式,x為初始點,e為終止誤差。輸出也為兩個引數,k表示迭代的次數,

% ender表示找到的最低點。

%梯度下降法,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;

endendender=double(x); %終點

end

其中的初始點設為[3;3],誤差設為10^(-20);結果為迭代27次找到了[2;1]點為最值點。

二、學習率怎麼求

學習率是通過損失函式求得到的。我在csdn中看到一篇文章。有乙個總結。

針對原始的樣本(1,2)

針對線性回歸的函式 y=kx

對應的損失函式是 y=2kx^2,

那我們的方向就是希望最小化這個損失函式,得到最終的k值,然後再代入到

原始的線性函式中,那具體應該如何在最小化損失函式的時候得到對應的k值呢?

方法一:對於損失函式求導,然後令導數等於0,得到對應的k值,有時候並不能直接解出來,並且這種方式可能是區域性最優;

方法二:採用梯度下降與學習率的方法去求得最後的k值,明確梯度下降中的梯度

實際指的是損失函式的斜率,初始對於k設定乙個值例如0.3,然後將k值與樣本中的x值代入到損失函式中,得到損失函式的y值就是差距值,如果這個差距值符合要求就可以,但是太大的話可能就需要不斷的去調節這個k值,那新的k值如何獲得呢,對應的公式如下:

k1=k+at,

其中k1就是新的k值,k是初始設定的那個k值,而其中的a就是學習率,一般可以設定0.01,對於學習率的設定,如果設定的太小就會導致最終收斂太慢,而如果設定的太大的話,可能就會錯過最小值點,因此需要設定合適,而其中的t就是對應算是函式的斜率,得到的方式就是對損失函式進行求導,然後將樣本中的x值與初始k值代入到對應的其中得到斜率,得到新的k值,然後再將新的k值和x值代入到損失函式中,看下函式的差值是否在那個區間內。

總結:梯度下降其實就是斜率不斷的下降,最終希望是斜率為0對應的就是在谷底的時候得到對應的k值,就是最好的k值。

matlab實現梯度下降法

大三上學期學了 運籌學 課程,裡面包含了許多演算法和模型。模型就是線性規劃及線性規劃的對偶理論,單純形法以及它的實際應用 整數規劃及其解法 分支定界法 割平面法匈牙利演算法 目標規劃 非線性規劃動態規劃 決策分析等等。實際上,這些模型在參加暑假數學建模培訓的時候,多多少少接觸過,所以還算比較熟悉的。...

梯度下降法 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...

matlab梯度計算

clc x 8,9,6,9,2 5,8,7,0,1 4,5,4,6,9 8,1,0,9,5 fx,fy gradient x 結果如下 fx 1.0000 1.0000 0 2.0000 7.0000 3.0000 1.0000 4.0000 3.0000 1.0000 1.0000 0 0.500...