【機器學習】1 監督學習應用與梯度下降
監督學習
簡單來說監督學習模型如圖所示
其中 x是輸入變量 又叫特征向量 y是輸出變量 又叫目標向量
通常的我們用(x,y)表示一個樣本 而第i個樣本 用(x(i),y(i))表示
h是輸出函數
監督學習的任務是學習一個模型,使模型能夠對任意的輸入,做出很好的預測。
習慣的樣本訓練數目用m表示
梯度下降算法
h(x) = Θ0 +Θ1x1+...+Θixi
J(Θ)= 1/2 *∑(i from 1 to m) (h(Θ)(x (i) - y(i))^2
Θ(i) := Θ(i) - α * (?/?Θ(i))J(Θ)
(其過程好比在山上某一點 在當前點找到最一個方向,使得這點下山速度最快,其原理是通過求導,使梯度下降)
梯度下降算法的計算步驟:
1. 先決條件: 確認優化模型的假設函數和損失函數。
比如對於線性回歸,假設函數表示為 hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 其中θi (i = 0,1,2... n)為模型參數,xi (i = 0,1,2... n)為每個樣本的n個特征值。這個表示可以簡化,我們增加一個特征x0=1 ,這樣hθ(x0,x1,...xn)=∑i=0nθixihθ。
同樣是線性回歸,對應於上面的假設函數,損失函數為:
J(θ0,θ1...,θn)=12m∑i=0m(hθ(x0,x1,...xn)?yi)2J(θ0,θ1...,θn)=12m∑i=0m(hθ(x0,x1,...xn)?yi)2
2. 算法相關參數初始化:主要是初始化θ0,θ1...,θn,算法終止距離ε以及步長α。在沒有任何先驗知識的時候,我喜歡將所有的θ初始化為0, 將步長初始化為1。在調優的時候再 優化。
3. 算法過程:
1)確定當前位置的損失函數的梯度,對於θiθi,其梯度表達式如下:
?θiJ(θ0,θ1...,θn)
2)用步長乘以損失函數的梯度,得到當前位置下降的距離,即α?θiJ(θ0,θ1...,θn)對應於前面登山例子中的某一步。
3)確定是否所有的θi,梯度下降的距離都小於εε,如果小於ε則算法終止,當前所有的
4)更新所有的θθ,對於θi,其更新表達式如下。更新完畢後繼續轉入步驟1.
θi:=θi?α?θiJ(θ0,θ1...,θn)
例如 : 對房屋的現有x1 = 尺寸 x2 = 鄰居
則有h(x) = hθ(x) = θ0 +θ1x1+θ2x2 (θ0 = 0)
= ∑ (n from 1 to n) θixi = θTx;
J(θ) = (?/?Θ(i))(1/2 * hθ(x) -y)^2;
J‘(θ) = [hθ(x) -y)]*x(i);
更新步驟 θ(i) := θ(i) - α (hθ(x) - y)*x(i);
(α為學習速度)
通過不斷的叠代更新,減小梯度 直到收斂
在MATLAB下實現
% 設置步長為0.1,f_change為改變前後的y值變化,僅設置了一個退出條件。 syms x;f=x^2; step=0.1;x=2;k=0; %設置步長,初始值,叠代記錄數 f_change=x^2; %初始化差值 f_current=x^2; %計算當前函數值 ezplot(@(x,f)f-x.^2) %畫出函數圖像 axis([-2,2,-0.2,3]) %固定坐標軸 hold on while f_change>0.000000001 %設置條件,兩次計算的值之差小於某個數,跳出循環 x=x-step*2*x; %-2*x為梯度反方向,step為步長,!最速下降法! f_change = f_current - x^2; %計算兩次函數值之差 f_current = x^2 ; %重新計算當前的函數值 plot(x,f_current,‘ro‘,‘markersize‘,7) %標記當前的位置 drawnow;pause(0.2); k=k+1; end hold off fprintf(‘在叠代%d次後找到函數最小值為%e,對應的x值為%e\n‘,k,x^2,x)
運行結果如圖所示:(在octave中實現)
【機器學習】1 監督學習應用與梯度下降