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