對於瞭解機器學習中二元分類問題的來源與分析,我認為王樹義老師這篇文章講的非常好,通俗且易懂:
http://blog.sciencenet.cn/blog-377709-1121098.html
但王樹義老師的這篇文章並未詳細的展開說明二元分類的具體實現方法,只是在巨集觀上的一個概述。在閱讀這篇文章後,我便心生實現一個簡單的二元分類並把前後過程記錄下來的念頭,所以本篇的主體以演算法實現為主,略帶分析,並不會涉及太多的理論知識。本篇以線性Logistic Regression為主要的模型工具來做一個簡單的二元分類,關於Logistic Regression理論部分,我認為下面這篇文章講的不錯:
Logistic Regression(邏輯迴歸)原理及公式推導
資料生成與標記
Logistic Regression也是有監督學習中的一種,需要一定的訓練樣本,並且這些訓練樣本還需要預先進行標記分類。在本次試驗中,從座標(0, 0)到座標(100, 100)這麼一個矩形範圍內隨機生成100個整數座標$(X_1, X_2)$作為訓練樣本,其中$ 0leq X_1 leq 100, 0leq X_2 leq 100 $。在生成樣本的同時進行標記,為了使得樣本分類顯得不那麼規整,又分佈比較均勻,設定當樣本座標滿足$ (X_{1}^2 + X_{2}^2) <80^2 $標記為0,否則標記為1。這麼做恰好滿足了剛剛提到的樣本生成的兩個要求,分界線為弧線,所以在樣本量不大的情況下就不會顯得那麼規整,半徑為80的1/4圓又恰好將100×100的矩形分為面積相等的兩個部分。下圖為生成並標記好的樣本資料:
Cost Function計算
Cost Function在這裡是我們判斷模型準確性的主要依據,來源於單個樣本Loss Function的總和平均,也就是說如果訓練樣本有M個,Cost Funciton可以寫為:
$$ mathrm{Cost} = frac{1}{M} sum mathrm{Loss} $$
但是實際上有沒有平均或者求和前的係數為多少對於後面權重引數的更新是沒有影響的,所以有時為了方便後續的計算,會對這個係數做一些改變。這裡需要著重提及的是Loss Function的計算。
在應用與二元分類的Logistic Regression中,常用的Loss Function主要是兩種,方差$Loss_{Sq}$與交叉熵$Loss_{Lg}$,分別可以寫為:
$$ Loss_{Sq} = (H(X, heta) – y)^2 \ Loss_{Lq} = yln(H(X, heta)) + (1 – y)ln(1 – H(X, heta))$$
下面我們會簡單的比較一下這兩種Loss Fucntion計算方法的優劣,不過這裡需要先提一下的是Loss Function本身,$Y$是樣本標記矩陣,函式$H(X, heta)$中的$X$為輸入樣本矩陣,$ heta$為權重矩陣。本質上來說,$H(X, heta)$是訓練樣本關於權重$ heta$的線性迴歸再對映到sigmoid函式。這一部分的解釋在Logistic Regression(邏輯迴歸)原理及公式推導 中已經被描述的很清楚了,便不再贅述。
梯度下降法
Cost Function計算出來後,這個二元分類問題就轉變為了一個無約束優化問題,即找尋使得Cost儘可能小的權重矩陣$ heta$,梯度下降法便是一個常用的解決無約束優化問題的方法。關於梯度下降法的具體理論與簡單實現,我認為這篇文章寫的很詳細,可以參考:深入淺出–梯度下降法及其實現。
梯度下降法的核心部分用Matlab描述出來實際上是很簡單的:
while(True) theta = theta - alpha * gradient [cost, gradient] = CostFunction(theta, X, Y) end
這演算法中的gradient便是Cost Function關於權重$ heta$的梯度,如果用數學表示出來,設$J$為Cost Fucntion,則有(假設樣本維度為3):
$$mathrm{gradient} =
abla J = left< frac{partial J}{partial heta_1}, frac{partial J}{partial heta_2}, frac{partial J}{partial heta_3}
ight>$$
這裡嘗試計算一下Loss Function方差形式的梯度,交叉熵形式的梯度計算較為複雜,不過原理相同,就不再展開了,這篇文章給出了詳細的推導過程,可以參考:https://www.cnblogs.com/alfred2017/p/6627824.html
$$ egin{align}
abla Loss_{Sq}(x) & =
abla (H(x, heta) – y)^2 \ & = 2(H(x, heta) – y)
abla H(x, heta)\ & = 2(H(x, heta) – y) frac{exp(- heta^T x)}{(1 + exp(- heta^T x))^2} left< x^{(1)}, x^{(2)}, x^{(3)}
ight> end{align}$$
在這裡關於樣本x的函式$frac{exp(- heta^T x)}{(1 + exp(- heta^T x))^2}$的存在予否實際上並不影響梯度下降的方向,這個函式在實數域上始終大於0,如在gradient的計算中考慮該項,則影響的僅僅是學習速率,最終結論並不會有太大的的變化,所以實際應用中可將其捨棄或看作為常數。
如果將這裡的Loss Function以求和方式替換為Cost Function,則可以將其寫為:
$$egin{align}
abla Cost_{Sq} & = sum_{i = 1}^{i = M}
abla Loss_{Sq}(x_i)\ & =2 sum frac{exp(- heta^T x_i)}{(1 + exp(- heta^T x_i))^2} (H(x_i, heta) – y_i) left< x^{(1)}_i, x^{(2)}_i, x^{(3)}_i
ight>\& = 2K X^T (H(x_i, heta) – Y) end{align}$$
分類結果
中間藍線為分界線
這條分界線是以sigmoid函式閾值為0.5計算出來的,也就是說落在分界線上的樣本座標點應當滿足$H(x, heta) = 0.5$,也意味著滿足條件$ heta^TX = 0$,這裡樣本的特徵維度皆為3,所以該條件可以寫為(樣本特徵的第一維度皆為值為1的Bias,即$x_1 = 1$。$x_2$與$x_3$為樣本座標點),這同時也是分界線的函式表示式:
$$ heta_1 + heta_2 x_2 + heta_3 x_3 = 0 $$