梯度下降法:
已一元二次為例,保證該函式是凸函式(凸函式即區域性最優點一定是全域性最優點)
這樣乙個函式 f(x),我們想求得 f(x)=0 的解。
給定乙個初值
但實際上我們求得的梯度是有大小的,很容易走的步子太大或太小,為了便於控制,我們將梯度單位化,只保留方向。
step.這時候每次走的長度就可以控制了。
演算法過程:
給定初值 x,誤差err, 步長
如果norm(grad)
用梯度下降法求函式f(x)=0
f(x)是乙個函式的話,那麼找到解,這個解的梯度應當為0,可是我用梯度小於誤差err作為迴圈終止條件時,卻總得不到 正確結果,想了想,可能總是得到了區域性最優解了。
例子:f(x)=x*e^(x),q求f(x)=0;
clear all;clc;
x=[5]';err=0.000005;learn=0.0004;
grad=g(x);
%while(f(x)>err)
while(norm(grad)>err)
x=x-learn*(grad/norm(grad))
grad=g(x);
endfunction[gx]=g(x)
n=length(x);
dt=1e-8;
i=eye(n);
fx=f(x);
for i=1:n
gx(i)=(f(x+dt*i(:,i))-fx)/dt;
endgx=gx(:);
endfunction[fx]=f(x)
fx=x*exp(x)-1;
end
得到的結果:
很明顯不對,畫圖看看。可以看到在x=-1是梯度的確趨於0,但是真正的解卻在0.5左右。
我們再用 f(x)>err作為終止條件
此時得到乙個近似解,與圖中相符合。
而當 f(x)=x1+x2^2-7時,整個程式更是停不下來,原因是有乙個梯度始終為 1,所以我覺得終止條件還是 f(x)>err好一點
但是如果誤差設定的小而最小值卻高於誤差,那麼程式便不會終止。
所以梯度下降法使用的函式一定要是凸函式,便可以用 where(norm(grad)>err)了。
附上完善的**:
clear all;clc;
x=[1,1]';%初始化x
err=input('誤差,err=');%所要求的誤差
step=input('步長,step=');%步長
cnt=0;
grad=g(x);%g(x)是在點x處的梯度
while(norm(grad)>err)
x=x-step*(grad/norm(grad));
grad=g(x);
cnt=cnt+1;
enddisp('解');x
disp('迭代次數');cnt
function[gx]=g(x)%g(x)函式求在x處的梯度
n=length(x);% x變數的個數
dt=1e-8;
i=eye(n);
fx=f(x);
for i=1:n
gx(i)=(f(x+dt*i(:,i))-fx)/dt;
endgx=gx(:);
endfunction[fx]=f(x)%f(x)函式
fx=x(1)-x(2)+2*x(1)*x(1)+2*x(1)*x(2)+x(2)*x(2);
end
梯度下降法和隨機梯度下降法
批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...
梯度下降法
梯度下降法 是乙個一階 最優化演算法 通常也稱為 最速下降法 我之前也沒有關注過這類演算法。最近,聽史丹福大學的機器學習課程時,碰到了用梯度下降演算法求解線性回歸問題,於是看了看這類演算法的思想。今天只寫了一些入門級的知識。我們知道,函式的曲線如下 程式設計實現 c code cpp view pl...
梯度下降法
回歸 regression 梯度下降 gradient descent 發表於332 天前 技術,科研 被圍觀 1152 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...