除了前幾天介紹的邏輯回歸可以幫助我們分類之外,在機器學習上還有一個相當流行且有用的方法叫做 SVM(Support Vector Machine),透過定義核函數(kernel function)的方式,還能夠分類非線性的特徵。
首先我們先來看看下面這張圖:
h1 與 h2 都能正確地把資料分為兩等份,不過對於仔細看一下另外加上去的點,如果按照 h1 分類,應該會被歸類為 O
,而用 h2 分類的話,則會分類到 X
。就肉眼來看,我們希望這條線應該要離左右兩邊越遠越好。因此,h2 會是比較好的分割線。
在 SVM 當中,我們會把這條線分割的左右兩邊叫做分割超平面(separating hyperplane)。而這條線跟左右兩邊的距離在 SVM 當中稱為邊距(margin)。
$$
w_{0}+w^Tx_{o}=1
\
w_{0}+w^Tx_{X}=-1
$$
這是我們希望的預測結果,所有 O 的樣本應該要能夠在右邊的平面(用 1 表示),而 X 樣本要在左邊的平面(用 -1 表示)。
將兩式相減後得到:
$$
w^T(x_{o}-x_{X})=2
$$
兩邊除以 w 的長度:
$$
||w||=\sqrt{\sum_{i=1}^{m}w_i^2}
\
\frac{w^T(x_{o}-x_X)}{||w||}=\frac{2}{||w||}
$$
我們希望讓左右兩邊的相距(margin)最大。把 (1) 融合成一條式子:
$$
y_{i}(w^Tx_{i}+w0) \geq1
\
min_{w}||w||
$$
讓兩邊的 margin 最大,實際上就是讓 $||w||$ 的值最小。因此從這裡可以直觀地將 SVM 理解為找出一條線,分割出來的平面能夠讓距離這條線最近的兩個點的距離最大。
以上的式子並沒有辦法用梯度下降法直接求算,而是用一個叫做**拉格朗日乘數法(Lagrange Multiplier Method)**的方式求解。
這邊因為篇幅關係並不會講解如何求算 $||w||$ 的極值,在程式當中因為要求解 $||w||$ 也是相當複雜的工作,因此 SVM 的部分代碼會用 scikit-learn 帶過。不過有興趣的讀者們可以參考 SMO algorithm 為了解決 SVM 無法用梯度下降而發明的演算法。
有時候特徵的分佈不一定是線性相關的,像是下面這張圖:
如果用方程式表示,這條線看起來可能是 $x^2+y^2$ 這種曲線。那麼在
在實務上可能希望分類時對靠近邊界的點不必那麼嚴格,也就是能夠容忍一些錯誤空間。在 SVM 中加入閒置變數(slack variable)來限制邊界的寬度。這在線性分類下可能看不太出來,不過