機器學習之——判定邊界和邏輯迴歸模型的代價函數

判定邊界(Decision Boundary)

上一次我們討論了一個新的模型——邏輯迴歸模型(Logistic Regression),在邏輯迴歸中,我們預測:

  • 當hø大於等於0.5時,預測y=1
  • 當hø小於0.5時,預測y=0
根據上面的預測,我們繪製出一條S形函數,如下:


根據函數圖像,我們知道,當

  •  z=0時,g(z)=0.5
  •  z>0時,g(z)>0.5
  •  z<0時,g(z)<0.5
又有:


所以


以上,爲我們預知的邏輯迴歸的部分內容。好,現在假設我們有一個模型: 並且參數ø是向量 :[-3 1 1]。那麼當-3+x1+x2大於等於0,即x1+x2大於等於3時,模型將預測 y=1。

我們可以繪製出來x1+x2=3,這條線便是我們模型的分界線,也稱之爲判定邊界(Decision Boundary),將預測爲1的區域和預測爲0的區域分隔開。


假設我們的數據呈現出如下圖的分佈情況,那麼我們的模型是什麼樣才能適合這些數據呢?


如上圖,函數圖像爲一個圓,圓點在原點且半徑爲1,這樣一條曲線來分隔開了 y=1 和 y=0 的區域,所以我們需要的是一個二次方特徵:


假設參數爲 [-1  0  0  1  1],則我們得到的判定邊界恰好是圓點在原點並且半徑爲1的圓形。

我們可以使用非常複雜的模型來適應非常複雜形狀的判定邊界。


邏輯迴歸模型的代價函數(Cost Function)

對於線性迴歸模型,我們定義的代價函數是所有模型誤差的平方和。理論上講,我們也可以沿用這個定義來對邏輯迴歸模型使用,但是問題在於,當我們將:

代入到這樣定義的代價函數中時,我們得到的代價函數將會是一個非凸函數(Non-covex Function)


這意味着,我們的代價函數將會有許多的局部最小值,這就會影響到梯度下降算法去找尋全局最小值。

因此,我們重新定義邏輯迴歸的代價函數爲:


其中,Cost(hø(x(i), y(i))) 是我們定義的一個代價函數迭代形式,具體表示如下:


hø(x) 與 Cost(hø(x),y)之間的關係是如下圖所示:


通過這樣構建的Cost(hø(x), y)函數的特點是:

當實際的 y=1 且 hø=1 時,誤差爲0;當  y=1 但 hø != 1時,誤差隨hø的變小而變大;

當實際的 y=0 且 hø=0 時,誤差代價爲0;當 y=0 但 hø != 0 時,誤差隨hø的變大而變大。

將構建的Cost(hø(x), y) 進行一個簡化,可以得到如下簡化公式:


這個簡化其實是對上面Cost(hø(x), y) 的兩種表達式的一次性結合。

將簡化代入到代價函數,得到:


這便是邏輯迴歸模型的代價函數了。

在得到這樣的一個代價函數之後,我們便可以使用梯度下降算法(Gradient Descent)來求得能夠使代價函數最小的參數了。

梯度下降算法:


對此求導,得到:


*注:雖然得到的梯度下降算法,表面上看上去和線性迴歸的梯度下降算法一樣,但是這裏的hø(x) = g(øTX)與線性迴歸不同,所以實際上是不一樣的。另外,在運行梯度下降算法之前,對特徵進行特徵縮放(Features Scaling)也是非常必要的。


一些梯度下降算法之外的選擇:

除了梯度下降算法之外,還有一些常被用來使代價函數最小的算法,這些算法更加複雜和優秀,而且通常情況下,不需要人工選擇學習速率,通常也比梯度下降算法更加快速。舉一些例子:共軛梯度法(Conjugate Gradient)局部優化法(Broyden Fletcher Goldfarb Shann, BFGS)有限內存局部優化法(LBFGS)。這些算法更加複雜也更加優秀,如果感興趣我們可以以後再繼續討論。

MatlabOctave中,有一個最小值優化函數,fminunc。使用時,我們需要提供代價函數和每個參數的求導,這裏給大家舉一個例子:

function [ jVal, gradient ] = costFunction( theta )
%COSTFUNCTION Summary of this function goes here
%   Detailed explanation goes here
    jVal = (theta(1)-5)^2 + (theta(2)-5)^2;
    gradient = zeros(2,1);
    gradient(1) = 2*(theta(1)-5);
    gradient(2) = 2*(theta(2)-5);

end

options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);

*PS :關於機器學習相關算法的MatlabOctave代碼,我上傳到了我的coding.net項目中,有需要的童鞋可以聯繫我。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章