大三上學期學了《運籌學》課程,裡面包含了許多演算法和模型。模型就是線性規劃及線性規劃的對偶理論,單純形法以及它的實際應用;整數規劃及其解法(分支定界法、割平面法匈牙利演算法);目標規劃;非線性規劃動態規劃、決策分析等等。實際上,這些模型在參加暑假數學建模培訓的時候,多多少少接觸過,所以還算比較熟悉的。
然後在這門課程裡面還學習了其它的一些優化演算法。比如說一維搜尋裡面的**分割法、加步探索法、牛頓法、拋物線法等演算法求函式的最優解。再後面還學習了無約束問題的最優化方法,約束問題的最優化方法這兩個非常重要的內容。那麼在無約束問題的優化演算法中,最讓人耳熟能詳也可能是應用最廣泛的就數最速下降法(也叫梯度下降法)、牛頓法、共軛梯度法了。在約束問題的優化演算法中主要涉及k-t條件,可行方向法、制約函式法。這些演算法在當今的機器學習領域應用還是十分廣泛的。
今天只分享梯度下降法。
簡單描述下梯度下降法的演算法步驟。至於詳細的原理與演算法的推導過程建議還是找一本運籌學書慢慢研究,實際上還挺簡單的。
%【梯度下降法】
%【輸入】f為目標函式(兩變數x1和x2),x為初始點,e為求解精度
%【輸出】k為迭代次數,ender為搜尋到的點,value為求得的函式值
%【呼叫方法】
% syms x1 x2;
% f函式
% x初始點
% e精度
% 呼叫[k ender,value]=steepest(f,x,e)
syms x1 x2 m; %m為學習率
d=-[diff(f,x1);diff(f,x2)]; %分別求x1和x2的偏導數,即下降的方向
flag=1; %迴圈標誌
k=0; %迭代次數
ezplot('x1^2+2*x2^2-4*x1-2*x1*x2')%畫出函式影象
axis([-0.5,10,-2,5])
hold on
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
drawnow;
pause(0.2);
k=k+1;
else
flag=0;
endhold off
endender=double(x); %終點
%輸出在此點的函式值
x1=ender(1,1);
x2=ender(2,1);
value=x1^2+2*x2^2-4*x1-2*x1*x2;
end
>> syms x1 x2;
>> x=[0;0];
>> f=x1^2+2*x2^2-4*x1-2*x1*x2;
>> [k,ender,value]=gradesc(f,x,e)
k =
20ender =
3.9961
1.9980
value =
-8.0000
其中k是迭代次數,ender是最後計算的到的極值點,value是函式在該極值點下的函式值。
最後,再給出梯度下降法演算法的評價。
梯度下降法對初始點的選擇要求不高,每一輪迭代工作量小,可以比較快地從初始點到達極小點附近;但在接近極小點時,演算法會出現鋸齒現象,收斂速度很慢。因為對於一般二元函式,在極小點附近可以用極小點的二階泰勒多項式來近似,而後者為凸函式時,它的等值線為一族共心橢圓,特別是當橢圓比較扁平時,收斂速度就非常慢。針對這種情況,解決的辦法是,將梯度法與其他演算法結合起來使用,前期使用梯度法,在極小點附近使用牛頓法。
梯度下降法 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梯度下降法
梯度下降法 英語 gradient descent 是乙個一階最優化演算法。要使用梯度下降法找到乙個函式的區域性極小值,必須向函式上當前點對應梯度 或者是近似梯度 的反方向的規定步長距離點進行迭代搜尋。如果相反地向梯度正方向迭代進行搜尋,則會接近函式的區域性極大值點 這個過程則被稱為梯度上公升法。梯...
在matlab中實現梯度下降法
梯度下降法的原理,本文不再描述,請參閱其它資料。梯度下降法函式function k ender steepest f,x,e 需要三個引數f x和e,其中f為目標函式,x為初始點,e為終止誤差。輸出也為兩個引數,k表示迭代的次數,ender表示找到的最低點。steepest.m function k...