公號:碼農充電站pro
主頁:https://codeshellme.github.io
本篇來介紹SVM 演算法,它的英文全稱是 Support Vector Machine,中文翻譯為支援向量機。
之所以叫作支援向量機,是因為該演算法最終訓練出來的模型,由一些支援向量決定。所謂的支援向量,也就是能夠決定最終模型的向量。
SVM 演算法最初是用來解決二分類問題的,而在這個基礎上進行擴充套件,也能夠處理多分類問題以及迴歸問題。
1,SVM 演算法的歷史
早在1963 年,著名的前蘇聯統計學家弗拉基米爾·瓦普尼克在讀博士期間,就和他的同事阿列克謝·切爾沃寧基斯共同提出了支援向量機的概念。
但由於當時的國際環境影響,他們用俄文發表的論文,並沒有受到國際學術界的關注。
直到 20 世紀 90 年代,瓦普尼克隨著移民潮來到美國,而後又發表了 SVM 理論。此後,SVM 演算法才受到應有的重視。如今,SVM 演算法被稱為最好的監督學習演算法之一。
2,線性可分的 SVM
SVM 演算法最初用於解決二分類問題,下面我們以最簡單的二維平面上的,線性可分的資料點來介紹支援向量機。
假設平面上有一些不同顏色的圓圈,這些圓圈是線性可分的,也就是可用一條直線分開。如下:
現在想在平面上畫出一條直線,將這些圓圈分開。通過觀察,你很容易就能畫出一條直線,如下:
但是這樣的直線會有很多,它們都能正確的劃分兩類圓圈,就像下面這幅圖中的一樣:
那麼哪條直線才是最好的呢?通過肉眼我們無法找到那條最好的直線。但是就上圖中的三條直線而言,明顯你會覺得中間那條紅線,會比兩側的兩條線要更好。
因為,如果有一些圓圈往中間靠攏,那麼兩側的那兩條直線就不能將兩種圓圈劃分開了。而中間那條直線依然可以劃分兩種圓圈。如下:
因此,中間那條紅線會比兩側的兩條直線更好,更安全。
雖然通過肉眼我們能知道哪條直線更好,但是怎樣才能找到最好的那條直線呢?而 SVM 演算法就可以幫我們找到那條最好的直線。
3,找到最好的直線
下面我們來看下如何找到最好的那條直線。
首先,找兩條平行線,其中一條線經過一個綠色圓圈,剩下的所有綠色圓圈都在這條線的左側;另一條線經過一個淡藍色的圓圈,剩下的所有淡藍色圓圈都在這條線的右側。
如下圖所示的兩條平行線 L1 和 L2,L1 經過了 A 圓圈,L2 經過了 B 圓圈:
接下來,讓 L1 以 A 為中心進行旋轉,L2 以 B 為中心進行旋轉,在旋轉的過程中,要保證下面兩個原則:
- L1 與 L2 保持平行。
- 除 A 之外的所有綠色圓圈都在 L1 的左側,除 B之外的所有淡藍色圓圈都在 L2 的右側。
在保證上面兩個原則的前提下旋轉,直到其中的一條線經過第三個圓圈為止。如下:
此時,L2 經過了第三個圓圈 C。
到此為止,我們要找的那條最好的,能夠劃分兩種圓圈的直線,就是 L1 和 L2 中間的那條直線,如下圖中的 L3:
4,SVM 演算法
SVM 演算法的求解過程,就是尋找那條最佳直線的過程。
在 SVM 演算法中,上面的 A,B,C 三個點叫作支援向量,直線 L3 是最佳直線,擴充套件到多維空間,這條直線叫作超平面。SVM 演算法的目的就是找到這個超平面,這個超平面是劃分資料點的最佳平面。
關於支援向量,更重要的是,SVM 訓練出的最終模型,只與支援向量有關,這也是支援向量機的名稱來源。就像 SVM 的發明者瓦普尼克所說的那樣:支援向量機這個名字強調了這類演算法的關鍵是如何根據支援向量構建出解,演算法的複雜度也主要取決於支援向量的數目。
直線 L1 和 L2 之間有無數條平行直線都可以將兩類圓圈分開,支援向量到這些平行直線的距離叫作分類間隔,而間隔最大的那條直線就是最佳直線,也就是 L3。
多維空間中的超平面可以用線性方程來表示:
其中的 W 為法向量,它決定了超平面的方向。b 為截距,它決定了超平面與空間原點的距離。
超平面將特徵空間分為兩部分,法向量所指向的一側的資料為正類,標記為 +1;另一側的資料為負類,標記為 -1。
二維座標系中的線性方程如下圖所示:
支援向量機的學習過程是一個凸二次規劃問題,可以用 SMO 演算法高效求解。
SMO 全稱為 Sequential Minimal Optimization,中文稱為序列最小優化,由 John Platt 於 1996 年發表。
5,線性 SVM
上文中介紹到的兩類圓圈是線性可分的,也就是可以用一條直線將所有不同的圓圈劃分開,而不允許有一個例外。如下:
但現實生活中的資料,往往是線性不可分的,如下圖中的兩類圓圈,就不可能找到一條直線將其分開:
使用線性可分的 SVM 是無法解決線性不可分問題的。要想解決線性不可分問題,就得將支援向量機一般化,這種向量機稱為線性 SVM(去掉了可分二字)。
線性 SVM 比線性可分SVM 更具通用性。線性可分SVM 尋求的是硬間隔最大化,而線性 SVM尋求的是軟間隔最大化。
硬體隔不允許有一個例外的點被錯分,而軟間隔則允許個別(不會很多)的點被錯分。
線上性不可分的資料集中,導致不可分的只是少量異常點,只要把這些異常點去掉,餘下的大部分樣本點依然滿足線性可分的條件。如下圖所示:
6,非線性問題
不管是線性可分 SVM 還是線性 SVM,它們都只能處理線性問題:
- 線性可分 SVM:存在一條直線將所有的點正確劃分。
- 線性 SVM:存在一條直線將絕大部分點正確劃分,而允許極個別點錯分。這些極個別點可稱為噪點或異常點。
與線性問題相對應的是非線性問題,比如下面兩種情況都是非線性問題:
如何讓 SVM 處理非線性問題呢?
7,核函式
既然在二維空間中,不能找到一條直線來處理非線性問題。那麼是否可以將二維空間對映成三維空間,從而找到一個平面,來處理二維空間不能處理的問題呢?
答案是肯定的,如果樣本的屬性數有限,那麼就一定存在一個高維特徵空間使樣本線性可分。
如下圖所示,在二維空間時,不能找到一條直線將其正確的分類;將其對映到三維空間後,可以找到一個平面,將其正確分類:
從下面這幅動圖可直觀的看到,二維空間的線性不可分對映到三維空間線性可分的轉換過程:
將原始低維空間上的非線性問題轉化為新的高維空間上的線性問題,這就是核技巧的基本思想。
支援向量機誕生於 1963 年,核技巧誕生於 1995 年。
在支援向量機中,核函式可以將樣本從低維空間對映到高維空間,從而使得 SVM 可以處理非線性問題。常用的核函式有以下幾種:
- 線性核函式
- 多項式核函式
- 高斯核函式
- 拉普拉斯核函式
- Sigmoid 核函式
不同的核函式對應不同的對映方式。在SVM 演算法中,核函式的選擇非常關鍵,好的核函式會將樣本對映到合適的特徵空間,從而訓練出更優的模型。
核函式將線性SVM 擴充套件成了非線性 SVM,使得 SVM 更具普適性。
8,多分類問題
SVM 演算法最初用於處理二分類問題,那它如何處理多分類問題呢?
對於多分類問題,可以將多個二分類器組合起來形成一個多分類器,常見的方法有一對多法和一對一法。
一對多法
對於有 K 個分類的資料集,把其中的一類作為正集,其它的 K-1 類作為負集,這樣就把資料集分了正負兩類。
比如我們有一個資料集,該資料集有三個分類 A,B,C,那麼將訓練出三個分類器:
- 將分類 A 作為正集,B,C 作為負集,訓練出一個分類器。
- 將分類 B 作為正集,A,C 作為負集,訓練出一個分類器。
- 將分類 C 作為正集,A,B 作為負集,訓練出一個分類器。
如下圖所示:
對於 K 個分類的資料集,一對多法會訓練出 K 個分類器。缺點是,每次訓練分類器時,負樣本數都大大多於正樣本數,造成樣本分佈不均。
一對一法
對於有 K 個分類的資料集,任選其中的兩類樣本,然後訓練出一個分類器。
比如我們有一個資料集,該資料集有三個分類 A,B,C,那麼將訓練出三個分類器:
- 選 A,B 兩類資料,訓練出一個分類器。
- 選 A,C 兩類資料,訓練出一個分類器。
- 選 B,C 兩類資料,訓練出一個分類器。
如下圖所示:
那麼這種方法將會訓練出 C(K, 2) 個分類器,因此這種方法的缺點是,如果資料集的分類較多的話,訓練出的分類器將會非常多。
9,總結
SVM 演算法通過尋找一個超平面來處理分類問題。這個超平面只與幾個支援向量有關,而不會受其它的普通向量的影響。
SVM 可分為線性 SVM 和非線性 SVM,線性 SVM 只能處理線性問題,而不能處理非線性問題。
核函式可以將低維空間的非線性問題,轉化為高維空間的線性問題,這就將線性 SVM 擴充套件成了非線性 SVM,從而使得 SVM 可以處理非線性問題。
SVM 演算法最初用來處理二分類問題,對於多分類問題,可以將多個二分類器組合在一起成為一個多分類器,從而處理多分類問題。方法有一對多法和一對一法。
下一節將介紹如何用 SVM 處理實際問題。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術乾貨。