判定邊界(Decision Boundary)
上一次我們討論了一個新的模型——邏輯迴歸模型(Logistic Regression),在邏輯迴歸中,我們預測:
- 當hø大於等於0.5時,預測y=1
- 當hø小於0.5時,預測y=0
根據函數圖像,我們知道,當
- 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)。這些算法更加複雜也更加優秀,如果感興趣我們可以以後再繼續討論。
在Matlab或Octave中,有一個最小值優化函數,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 :關於機器學習相關算法的Matlab或Octave代碼,我上傳到了我的coding.net項目中,有需要的童鞋可以聯繫我。