Python機器學習筆記:SVM(1)——SVM概述
- 2020 年 6 月 3 日
- 筆記
- 機器學習常用演算法及筆記
前言
整理SVM(support vector machine)的筆記是一個非常麻煩的事情,一方面這個東西本來就不好理解,要深入學習需要花費大量的時間和精力,另一方面我本身也是個初學者,整理起來難免思路混亂。所以我對SVM的整理會分為四篇(暫定為四篇)學習,不足之處,請多多指導。
四篇分別為:
Python機器學習筆記:SVM(1)——SVM概述
Python機器學習筆記:SVM(2)——SVM核函數
Python機器學習筆記:SVM(3)——證明SVM
Python機器學習筆記:SVM(4)——sklearn實現
在整理筆記的時候,參考了不少的資料,不少網路寫的優秀論文,部落格,回答等。於是我在學習了SVM之後,加入了自己的理解,結合網友的筆記整理了自己能理解的SVM,於此寫下自己的學習筆記。本著取之於網路,還之於網路的想法,最後將部落格公開,最後申明一下,參考的部落格,知乎等地址,我均會附於文章後面,不喜勿噴,謝謝。
下面言歸正傳,開始學習SVM。
1,SVM的基本思想
支援向量機,因為英文名為 support vector machine,故一般簡稱為SVM。他是一種常用的判別方法,在機器學習領域是一個有監督的學習模式,通常用來進行模型識別,分類,回歸分析以及異常值檢測。
通俗的講:支援向量機是一種兩類分類模型,其基本模型定義為特徵空間上的間隔最大的線性分類器,其學習策略(分割原則)便是間隔最大化,最終可轉換為一個凸二次規劃問題的求解。
支援向量機是許多大佬在多年研究統計學習理論基礎上對線性分類器提出的另一種設計最佳準則。其原理也從線性可分說起,然後擴展到線性不可分的情況。甚至擴展到使用非線性函數中去。
支援向量機的提出有很深的理論背景,這個我們後面再學習,下面先說一下SVM的基本思想,SVM的主要思想可以概括為兩點:
1 它是針對線性可分情況進行分析,對於線性不可分情況,通過使用非線性映射演算法將低維輸入空間線性不可分的樣本轉化為高維特徵空間使其可分,從而使得高維特徵空間採用線性演算法對樣本的非線性特徵進行線性分析成為可能。
2 它是基於結果風險最小化理論之上在特徵空間中構建最優超平面,使得學習器得到全局最優化,並且在整個樣本空間的期望以某個概率滿足一定上界。
支援向量機的線性分類:是給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練演算法創建一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器。SVM模型是將實例表示為空間中的點,這樣映射就使得單獨類別的實例被儘可能寬的明顯的間隔分開。然後,將新的實例映射到同一空間,並基於他們落在間隔的哪一側來預測所屬類別。
支援向量機的非線性分類:除了進行線性分類之外,SVM還可以使用所謂的核技巧有效的進行非線性分類,將其輸入隱式映射到高維特徵空間中。當數據未被標記時,不能進行監督式學習,需要用非監督式學習,它會嘗試找出數據到簇的自然聚類,並將新數據映射到這些已形成的簇。將支援向量機改進的聚類演算法被稱為支援向量聚類,當數據未被標記或者僅一些數據被標記時,支援向量聚類經常在工業應用中用作分類步驟的預處理。
SVM(Support Vector Machines)——支援向量機是在所有知名的數據挖掘演算法中最健壯,最準確的方法之一,它屬於二分類演算法,可以支援線性和非線性的分類。發展到今天,SVM已經可以支援多分類了。
首先,我們看一個例子:
比如上圖中,我們用一條直線將兩類數據分開了,但是我畫了三條線,而且這三條都能分開,但是這三條線那條更好呢?用SVM的思想來說,就是什麼樣的決策邊界才是最好的呢?更進一步,當數據特徵更加複雜,本身如果很難分,怎麼辦呢?那特徵複雜後,計算複雜度如何呢?那SVM能實際應用嗎?
讓我們帶著這些問題來學習SVM,而理解SVM,我們先得明白一個概念:線性分類器。
2,分類標準的起源:Logistic回歸
之前整理的Logistic回歸博文地址:
Python機器學習筆記:Logistic Regression
我們從最起源說起,雖然說之前博文已經學習過Logistic 回歸了,不懂的可以去看看,有詳細的筆記。但是這裡我還是簡單的再學習一邊別人理解的Logistic回歸筆記,溫故而知新。
給定一些數據點,他們分別屬於兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。如果用 x 表示數據點,用 y表示類別(y可以取1或者-1,代表兩個不同的類),一個線性分類器的學習目標便是要在 n 維的數據空間中找到一個超平面(hyper plane),這個超平面的方程可以表示為(其中WT中的T表示轉置):
Logistic回歸的目的是從特徵學習出一個 0/1 分類模型,而這個模型是將特徵的線性組合作為自變數,由於自變數的取值範圍是負無窮到正無窮。因此,使用Logistic函數(或者也稱為Sigmoid函數)將自變數映射到(0, 1)上,映射後的值被認為是屬於 y=1 的概率。
我們假設函數如下:
其中 x 是 n 維特徵向量,函數 g 就是Logistic函數,我們令 z = ΘTx ,則 g(z)為:
其影像為:
可以看到,將無窮映射到了(0, 1),而我們假設的 hΘx 就是特徵屬於 y=1的概率:
從而,當我們要判別一個新來的特徵屬於那個類的時候,只需要求出 hΘx 即可,若 hΘx 大於 0.5就是 y=1的類,反之屬於 y=0 的類。
此外,hΘx 只和 θTx有關, θTx >0 ,那麼 hΘx >0.5,而 g(z) 只是用來映射,真實的類別決定權還是在於 θTx 。再者,當 θTx >> 0 時,hΘx = 1,反之 hΘx = 0。如果我們只從 θTx 出發,希望模型達到的目標就是讓訓練數據中 y=1 的特徵 θTx >> 0,而 y=0 的特徵 θTx << 0。Logistic回歸就是要學習得到 θ,使得正例的特徵遠大於0,負例的特徵遠小於0,而且要在全部訓練實例上達到這個目標。
接下來,嘗試把 Logistic 回歸做個變形。首先,將使用的結果標籤 y=0 和 y=1 替換為 y = -1, y=1,然後將下面公式的 θ0 替換為 b。
最後將後面的 一串替換為 WTx,即下面一串被替換:
如此,則有了:
也就是說除了將 y由 y=0 變為 y=-1外,線性分類函數跟 logistic回歸的形式化g表示函數沒有區別,下面是Logistic回歸的形式化表示函數:
對於邏輯回歸我們先說到這裡,下面看線性分類和邏輯回歸的比較。
SVM和Logistic雖然說都是尋找一個線性分類界限,但出發點不同。SVM是以訓練集兩個類的邊界(支援向量)來考慮劃分,而Logistic是從訓練集的全局來考慮劃分。這也就是為什麼Logistic受雜訊和離群點的影響比較大。當出現一個離群點時,Logistic劃定的邊界很有可能會改變。而SVM這邊劃分的邊界卻可能絲毫不動(因為離群點並不影響我支援向量)。
3,線性分類的一個例子
3.1 線性可分的二分類模型
什麼是線性可分呢?如果一個線性函數能夠將樣本分開,稱這些數據樣本是線性可分的。那麼什麼是線性函數呢?在二維空間中就是一條直線,在三維空間中就是一個平面,依次類推,如果不考慮空位維度,這樣的線性函數就統稱為超平面。我們一般所說的線性可分支援向量機就對應著能將數據正確劃分並且間隔最大的直線。
定理1:線性二分類模型的目標就是找到一組合適的參數(w, b),使得:
即:線性二分類模型希望在特徵空間找到一個劃分超平面,將屬於不同標記的樣本分開。
我們下面舉個簡單的例子。如下圖所示,現在有一個二維平面,平面上有兩種不同的數據,分別用圈和叉表示。由於這些數據是線性可分的,所以可以用一條直線將這兩類數據分開,這條直線就相當於一個超平面,超平面一邊的數據點所對應的 y 全是 -1 ,另一邊所對應的 y 全是1。
上面的超平面可以用分類函數 f(x) 表示,f(x)如下:
當 f(x)=0 的時候,x便是位於超平面上的點,而 f(x) > 0的點對應 y=1 的數據點,f(x) < 0 的點對應 y = -1的點,如下圖所示:
換言之,在進行分類的時候,遇到一個新的數據點 x,將 x 代入 f(x) 中,如果 f(x) 小於0,則將 x 的類別賦予 -1,稱 xi 為正例;如果 f(x) 大於 0,則將 x 的類別賦予 1,稱xi為負例。
所以接下來的問題是,如何確定這個超平面呢?從直觀上而言,這個超平面應該是最適合分類兩類數據的直線。而判定「最適合」的標準就是這條直線離直線兩邊的數據的間隔最大。所以,得尋找有著c最大間隔的超平面。這個問題,我們先擱置一下,下面說一下線性可分支援向量機。
3.2 線性可分支援向量機
線性可分支援向量機(SVM)也是一種線性二分類模型,也需要找到滿足 定理1 約束的劃分超平面,即(w, b),由於能將樣本分開的超平面可能有很多,SVM進一步希望找到離個樣本都比較遠的劃分超平面。
當面對樣本的隨機擾動時,離每個樣本都比較遠的劃分超平面對擾動的容忍能力比較強,即不容易因為樣本的隨機擾動使得樣本穿越到劃分超平面的另外一側而產生分類錯誤。因此這樣的劃分超平面對樣本比較穩健,不容易過擬合。另一方面,離各樣本都比較遠的劃分超平面不僅可以把正負樣本都分開,還可以比較大的確信度將所有樣本分開,包括難分的樣本,即離劃分超平面近的樣本。
分類學習最基本的思想就是基於訓練集 D 在樣本空間中找到一個劃分超平面,將不同類別的樣本分開,但是能將訓練樣本分開的劃分超平面可能有很多,所有我們應該去找位於兩類訓練樣本「正中間」的劃分超平面。因為該劃分超平面對訓練樣本局部擾動的「容忍」性最好,例如,由於訓練集的局限性或者雜訊的因素,訓練集外的樣本可能比正中間的訓練樣本更接近於兩個類的分割界,這將使得許多劃分超平面出現錯誤。而正中間的超平面影響最小,所以這個劃分超平面所產生的結果是魯棒的。
所以問題就變為哪一個分類超平面是最優的?而要算最優超平面,肯定先算出間隔,只有間隔最大化,才能找出最優超平面,所以下面學習函數間隔。
4,函數間隔 functional margin 與幾何間隔 geometrical margin
間隔(margin):每個訓練觀測點到超平面距離中的最小值。
上面也提到了,我們的劃分超平面可以用如下線性方程來描述:
其中W為法向量,決定了超平面的方向,b為位移量,決定了超平面與原點的距離。
假設超平面能將訓練樣本正確的分類,即對訓練樣本(xi, yi),滿足以下公式:
該公式稱為最大間隔假設,yi = +1 表示樣本為正樣本,yi = -1 表示樣本為負樣本,式子前面選擇大於等於 +1,小於等於 =1隻是為了方便計算,原則上可是任意常數,但無論是多少,都可以通過對 w 的變換使其為 +1 和 -1,實際上公式等價於:
在超平面 w*x+b=0 確定的情況下, | w*x+b | 能夠表示點 x 到距離超平面的遠近,而通過觀察 w*x+b 的符號與類標記 y 的符號是否一致可以判斷分類是否正確,所以,可以用 (y * (w*x+b))的正負性來判定或表示分類的正確性。於此,我們便引出了函數間隔(functional margin)的概念。
一般的,當樣本點被分類正確時,定義函數間隔(用 γ hat 表示)為:
而超平面(w, b)關於 訓練數據集T 中所有樣本點(xi , yi)的函數間隔最小值(其中, x是特徵, y是結果標籤,i表示第 i 個樣本),便為超平面(w, b)關於訓練數據集T的函數間隔(即訓練觀測與超平面的間隔):
但這樣定義的函數間隔有問題,即如果成比例的改變 w 和 b (假設將他們改為 2w 和 2b),則函數間隔的值 f(x) 卻變成了原來的 2 倍(雖然此時超平面沒有改變),所以引出真正定義點到超平面的距離——幾何間距(geometrical margin)的概念。
假定對於一個點 x,令其垂直投影到超平面上的對應點為 x0, w是垂直於超平面的一個向量,γ 為樣本 x 到超平面的距離,如下圖所示:
根據平面幾何知識,有:
其中 ||w|| 為 w 的二階範數(範數是一個類似於模的表示長度的概念),w / ||w|| 是單位向量(一個向量除以它的模稱之為單位向量)。
又由於 x0 是超平面的點,滿足 f(x0) = 0,代入超平面的方差 wTx+b=0 ,可得 wTx0+b=0,即 wTx0 = -b。
隨即讓上式(平面幾何所得公式)的兩邊同時乘以 WT,然後根據 wTx0 = -b 和 wTw = ||w||2,即可算出 γ :
為了得到 γ 的絕對值,令 γ 乘上對應的類別 y,即可得出幾何間隔 (用 γ hat 表示)的定義:
從上述函數間隔和幾何間隔的定義可以看出:幾何間隔就是函數間隔除以 ||w||,而且函數間隔 y * (w*x+b) = y * f(x) 實際上就是 | f(x) |,只是人為定義的一個間隔度量,而且幾何間隔 | f(x) | / || w || 才是直觀上的點到超平面的距離。
4.1 點到超平面的距離
這裡補充一下點到超平面的距離的概念。設二維空間存在一個超平面實現二類可分如下圖所示:
圖中的斜線表示超平面 g(x) = w*x + b = 0,二維平面上一點 X 在超平面的距離投影為 X’,則二者關係可表示為 X = X’ + λ w(w 表示超平面的梯度向量),將 X 代入到 g(x)得:
點到超平面的距離即是 X 與 X’ 之間的距離:
該公司為高等數學中點到平面的距離公式,只不過這裡點和平面表達式的係數都用向量表示了。而我們上面卻是使用函數間隔和幾何間隔的角度引入距離的。所以注意區分。
我們使用PPT的內容表達如下:
5,最大間隔分類器 Maximum Margin Classifier 的定義
最大間隔超平面:間隔最大的超平面,即使得訓練觀測到分割超平面的間隔達到最大。
支援向量:樣本點中與分離超平面距離最近的樣本點的實例
最大間隔超平面的選取只與支援向量有關。
對一個數據點進行分類,當超平面離數據點的「間隔」越大,分類的確信度(confidence)也越大。所以,為了使得分類的確信度盡量高,需要讓所選擇的超平面能夠最大化這個「間隔」值。這個間隔就是下面的Gap的一半。
通過由前面的分析可知:函數間隔不適合用來最大化間隔值,因為在超平面固定以後,可以等比例地縮放 w 的長度和 b 的值,這樣可以使得 f(x) = wTx + b 的值任意大,亦即函數間隔 γ hat 可以在超平面保持不變的情況下被取得任意大。但幾何間隔因為除上了 ||w||,使得在縮放 w 和 b 的時候幾何間隔 γ hat 的值是不會改變的,它只隨著超平面的變動而變動。因此,這是更加合適的一個間隔。換言之,這裡要找的最大間隔分類超平面中的「間隔」指的是幾何間隔。
於是最大間隔分類器(maximum margin classifier)的目標函數可以定義為: max γ hat
同時需要滿足一些條件,根據間隔的定義,有(下面兩個式子是等價的):
其中,s.t 即subject to,它導出的是約束條件。
即我們希望最大化超平面關於訓練集的間隔 γ ,約束條件表示的是超平面關於每個訓練樣本點的間隔至少是 γ。
回歸一下幾何間隔的定義:
可知:如果令函數間隔 γ hat 等於1(之所以令 γ hat =1,是為了方便推導和優化,且這樣做對目標函數的優化沒有影響)則有 γ hat = 1 / || w || 且:
從而上述目標函數轉換成了(即線性可分支援向量機模型的最優化問題):
相當於在相應的約束條件下(約束條件為上上式子),最大化這個 1 / ||w|| 值,而 1 / ||w|| 便是幾何間隔 γ hat 。
如下圖所示,中間的實線便是尋找到的最優超平面(optimal Hyper Plane),其到兩條虛線邊界的距離相等,這個距離便是幾何間隔 γ hat ,兩條虛線間隔邊界之間的距離等於 2*γ hat ,而虛線間隔邊界上的點則是支援向量。由於這些支援向量剛好在虛線間隔邊界上,所以他們滿足 y( wTx + b) = 1(還記得我們把functional margin 定位1了嗎?上面我們方便推導和優化的目的,我們可以令 γ hat = 1),而對於所有不是支援向量的點,則顯然有 y( wTx + b) > 1。
所以線性可分支援向量機模型的最優化問題:
這是一個凸二次規劃問題,若能求出(1)~(2)的解 w*, b*,那麼就可以得到最大間隔超平面 w*Tx + b = 0 t及分類決函數 f(x)
其實到目前為止,對於只關心如何使用SVM的盆友便足夠了。可以不用深究其更深的原理了。而需要深究的話,那就接著來。
6,從線性可分到線性不可分
支援向量機是一種二分類模型,他的目的是尋找一個超平面對樣本進行分割,分割的原則是間隔最大化,最終轉換為一個凸二次規劃問題來求解,而由簡至繁的模型包括:
- 當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性可分支援向量機
- 當訓練樣本近似線性可分時,通過軟間隔最大化,學習一個線性支援向量機
- 當訓練樣本線性不可分時,通過核技巧和軟間隔最大化,學習一個非線性支援向量機
說這個的目的是什麼呢?就是我們上面一堆例子,通過線性可分的例子說明了支援向量機,要深入學習支援向量機,我們第一步肯定是從訓練樣本線性可分過渡到線性不可分。
那我們接著從之前的目標函數說:
由於求 1 / ||w|| 的最大值相當於求 1 /2 ||w||2 的最小值,所以上述目標函數等價於(w 由分母變為分子,從而也由原來的 max 問題變為 min 問題,很明顯,兩者問題等價):
因為現在的目標函數是二次的,約束條件是線性的,所以它是一個凸二次規劃問題(這些我們上面均提到了)。那麼這個問題如何求解呢?
可以用執行緒的QP(Quadratic Programming)優化包進行求解。簡單來說:就是在一定的約束條件下,目標最優,損失最小。
此外,由於這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange Duality)變換到對偶變數(dual variable)的優化問題,即通過求解與原問題等價的對偶問題(dual problem)得到原始問題的最優解,這就是線性可分條件下支援向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。
6.1整理一下我們的思緒
這裡使用老師的PPT,整理一下我們對SVM的理解。
6.2 從原始問題到對偶問題的求解
那麼什麼是拉格朗日對偶性呢?簡單來說,通過對每一個約束條件加上一個拉格朗日乘子(Lagrange multiplier)α,然後定義出拉格朗日函數(通過拉格朗日函數將約束條件融合到目標函數里去,從而只用一個函數表達式便能清楚的表達出我們的問題):
然後令:
而當所有約束條件都滿足時,則最優值為:
上式最優值即最初要最小化的量,所以在要求約束條件得到滿足的情況下最小化 1 /2 ||w||2 ,實際上等價於直接最小化 Θ(w) (當然,這裡也有約束條件(即KKT條件的約束),就是 αi >= 0, i=1,….n),容易驗證,當某個約束條件不滿足時,例如 yi * (w*xi + b) < 1,那麼顯然有 Θ(w) = ∞(只要令 αi = ∞ 即可)。
具體寫出來,目標函數變成了:
這裡用 P* 表示這個問題的最優解,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對 w 和 b 這兩個參數,而 αi 又是不等式約束,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:
交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用 d* 來表示。而且有 d* <= p*,在滿足某些條件的情況下,這二者等價,這時候就可以通過求解對偶問題來間接地求解原始問題。
換言之,之所以從 min max 的原始問題 p*,轉換為 max min 的對偶問題 d*,一者是因為 d* 是 p* 的近似解,二者轉換為對偶問題後,更容易求解。
所以下面可以先求 L 對w, b的極小,再求 L 對 α 的極大。
上面提到了 d* <= p* 在滿足某些條件的情況下,二者等價,而要讓兩者等價需滿足 strong duality(強對偶),而後有學者在強對偶下提出了KKT條件,且KKT條件的成立要滿足 constraint qualifications,而 constraint qualifications 之一就是 Slater條件。所謂的Slater條件,即指:凸優化問題,如果存在一個點 x,使得所有等式約束都成立,並且所有不等式約束都嚴格成立(即取嚴格不等號,而非等號),則滿足Slater條件。對於此處,Slater條件成立,所以 d* <= p* 可以取等號。
一般的,一個最優化數學模型能夠表示成下列標準形式:
其中f(x)是需要最小化的函數,h(x)是等式約束,g(x)是不等式約束,p和q分別為等式約束和不等式約束的數量。
同時,得明白以下兩點:
而KKT的條件就是指上面最優化數學模型的標準形式中的最小點 x* 必須滿足下面的條件:
經過論證,我們這裡的問題是滿足KKT條件的(首先已經滿足Slater條件,再者 f 和 gi 也都是可微的,即 L 對 w 和 b 都可導),因此現在我們便轉換為求解第二個問題。
也就是說原始問題通過滿足KKT條件,已經轉換成了對偶問題。而求解這個對偶學習問題,分為三個步驟:
- 1,要讓 L(w, b, a) 關於 w 和 b 最小化,
- 2,求 對 α 的極大
- 3,利用SMO演算法求解對偶問題中的拉格朗日乘子
6.3 對偶問題求解的三個步驟
根據拉格朗日的對偶性,原始問題的對偶問題是極大極小問題,所以我們求解對偶問題的步驟如下:
(1)首先固定 α,要讓 L 關於 w 和 b 最小化,我們分別對 w, b 求偏導數,即令 ∂L / ∂w 和 ∂L / ∂b 等於零:
將求偏導數的結果,代入下式:
得到:
推導過程如下:
最後,得到:
上面推導過程中,「倒數第4步」 推導到 「倒數第3步」 使用了線性代數的轉置運算,由於 ai 和 yi 都是實數,因此轉置後與自身一樣。「倒數第3步」 推導到「倒數第2步」 使用了(a + b + c + …)(a + b + c + …) = aa + ab + ac +ba +bb + bc + … 的乘法法則。最後一步是上一步的順序調整。
從上面的最後一個式子,我們可以看出,此時的拉格朗日函數只包含一個變數,那就是 αi 便能求出 w 和 b,由此可見,上面提出來的核心問題:分類函數 f(x) = wTx + b 也可以輕而易舉的求出來。
(2)對 α 的極大,即是關於對偶問題的最優化問題。經過上面第一個步驟的求 w 和 b,得到的拉格朗日函數式子已經沒有變數 w, b ,只有 α 。從上面的式子得到:
這樣,求出了 αi ,根據上面對 w 求偏導的式子,我們可以求出 w。然後通過下面式子,可以求出b,最終得到分離超平面和分類決策函數:
(3)在求得 L(w, b, a) 關於 w 和 b 最小化,以及對 α 的極大值後,最後一步則可以利用 SMO 演算法求解對偶問題中的拉格朗日乘子 α。
我們需要構造並求解對偶約束最優化問題
上述式子要解決的是在參數 {α1, α2, α3,…..αn} 上求最大值 W的問題,至於 x(i) 和 y(i) 都是已知數。要了解這個SMO演算法如何推導,後面繼續學。
6.4 拉格朗日乘子法求解SVM
這裡繼續使用老師的PPT對SVM的推導做一個梳理,其實就是整理上面6.2 6.3 小節的內容。
7,從線性不可分到非線性問題
為了過渡到非線性分類情況,我們先看看上述推導過程中得到的一些有趣的形式。
首先就是關於我們的 hyper plane,對於一個數據點 x 進行分類,實際上是通過把 x 代入到 f(x) = wTx + b 算出結果然後根據其正負號來進行類別劃分的。而前面的推導,我們得出:
因此分類函數為:
這裡的形式的有趣之處在於,對於新點 x 的預測,只需要計算它與訓練數據點的內積即可( < ·, ·>表示向量內積),這一點直觀重要,是之後使用Kernel進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裡顯示出來——事實上,所謂非 Supporting Vector所對應的係數 α 都是等於零的,因此對於新點的內積計算實際上只需要針對少量的「支援向量」 而不是所有的訓練數據即可。
為什麼非支援向量對應的 α 等於零呢?直觀上來看理解的話,就是這些「後方」的點——正如我們之前分析過一樣,對超平面是沒有影響的,由於分類完全由超平面決定,所以這些無關的點並不會參與分類問題的計算,因而也就不會產生任何影響了。
首先,我們看看通過Lagrange multiplier 得到的目標函數:
注意到如果 xi 是支援向量的話,上式中紅顏色的部分是等於0 的(因為支援向量的 functional margin 等於1),而對非支援向量來說,functional margin 會大於 1,因此紅顏色部分是大於零的,而 αi 又是非負的,為了滿足最大化, αi 必須等於0。這也就是這些非 supporting vector 的局限性。
至此,我們便得到了一個 maximum margin hyper plane classifier,這就是所謂的支援向量機(Support Vector Machine)。當然,,到目前為止,我們的SVM還比較弱,只能處理線性的情況,不過,在得到了對偶 dual 形式之後,通過 Kernel推廣到非線性的情況就變成了一件非常容易的事情了(我們之前說過:通過求解對偶問題得到最優解,這就是線性可分條件下支援向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題)。
8,從線性不可分到特徵空間映射與核函數問題——線性不可分支援向量機
8.1 線性不可分
線性不可分定義如下圖:
對於上圖的二分類數據點,普通線性分類器不行,最大間隔超平面和軟間隔超平面也無能為力。面對這樣的線性不可分問題,通常的思路是找一個非線性分類邊界(比如組合分類器)來實現分類,而SVM則另闢蹊徑,將數據點從原始空間映射到特徵空間,而數據在特徵空間往往就能實現線性可分。
8.2 特徵空間映射
對於非線性問題,線性可分支援向量機並不能有效解決,要使用非線性模型才能很好的分類。
- 一維空間向二維空間映射
下面我們考慮一維空間的二分類問題:
我們將它進行一個二次變換,換到二維空間,這裡的變換為 x -> x2。
從上面的例子,我們知道變換的核心思想就是:將原始輸入空間的數據集映射到高維特徵空間中,從而使得數據集可分。
- 二維空間向二維特徵空間映射
上圖中二維空間不可分,但是變換一下坐標空間,也能實現線性可分。
- 二維空間向三維空間的映射
二維空間的數據點不僅可以映射到二維空間,同樣也可以映射到三維,如上所示,所以同樣可以找到一個超平面能夠實現在三維空間的線性可分。
首先將原始的輸入特徵通過函數 h(xi) 映射到高維空間,拉格朗日對偶有如下形式:
決策函數為:
8.3 核函數
原始空間向特徵空間的映射需要藉助映射函數 Ψ(x)。例如對於數據點 xi,映射到特徵空間就變成了Ψ(xi)。而SVM的一大巧妙之處就是映射後的特徵空間數據點內積的計算等價於低維空間數據點在映射函數對應的核函數中計算。這大大降低了運算量,因為有的時候高維空間的計算很複雜,下圖是一個將 m 維度向量的映射到特徵空間的映射函數的例子:
映射後的維度大概是 m^2 / 2 維,則計算映射後的數據內積 Ψ(xi)T*Ψ(xj) 的時間複雜度為 O(n^2)。而如果使用核函數,則計算複雜度會降低為 O(n),例如:
其中 a,b為 m維的向量,Ψ(a) 為 a 經過上面的映射函數後的 m^2 / 2維向量,可以看出核函數 K(a, b) = (aT*b + 1)2 計算的時間複雜度為 O(n)。
核函數是指:設從輸入空間 Χ 到特徵空間 H的一個映射 h,對任意 x, z 屬於 X,函數 K(x, z) 滿足 K(x, z) = (h(x), h(z)),則稱 K 為核函數。
具體的核函數,我們下一節完整介紹,這裡不再贅述。
核技巧:在學習與預測中只定義核函數,而不顯示的定義映射函數 h。
通常,直接計算 K(x, z)比較容易,而通過 h(x) 和 h(z) 計算 K(x, z)並不容易。
而成為核函數的充要條件:設 K 是對稱函數,則 K(x, z)為核函數的充要條件是對輸入空間中任意xi,i=1,2,….m,Gram矩陣K = [K(xi, xj)] m * m 是半正定矩陣。
對偶問題的目標函數:
決策函數的形式:
對SVM從簡到難的介紹就到這裡,然後下一篇文章主要學習核函數的問題,下下一篇對使用Sklearn實現SVM進行了解,最後我們證明一下SVM。這個系列就算結束。可能這一個多月的整理,我不是百分百理解它,但是我相信這是我理解它的開始。
9,從線性不可分到軟間隔問題——使用鬆弛變數處理 outliers(軟間隔支援向量機)
軟間隔(soft-margin):有時候數據中有一些噪音點,如果我們考慮他們,那麼我們的分割超平面就不太好了。
在之前討論支援向量機的時候,我們就假定,數據是線性可分的,即我們可以找到一個可行的超平面將數據完全分開。後來為了處理非線性數據,在下文使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的情況也能處理。雖然通過映射 Φ(•) 將原始數據映射到高維空間之後,能夠線性分隔的概率大大增加,但是對於某些情況還是很難處理。
例如可能並不是因為數據本身是非線性結構的,而只是因為數據有噪音。對於這種偏離正常位置很遠的數據點,我們稱之為 outlier,在我們原來的SVM模型里,outlier的存在有可能造成很大的影響,因為超平面本身就是只有少數幾個 support vector 組成的,如果這些 support vector里又存在 outliers 的話,其影響就很大了。例如下圖:
用黑圈圈起來的那個藍點是一個 outlier,它偏離了自己原本應該在的那個半空間,如果直接忽略掉它的話,原來的分割超平面還是挺好的,但是由於這個 outlier 的出現,導致分割超平面不得不被擠歪了,變成途中黑色虛線所示(這只是一個示意圖,並沒有嚴格計算精確坐標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將數據分開的超平面來。
為了處理這種情況,SVM 允許數據點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面藍色間隔邊界上,而不會使得超平面發生變形了。
也就是說,在有鬆弛的情況下 outline 點也屬於支援向量SV,同時,對於不同的支援向量,拉格朗日參數的值也不同,如此篇論文 《Large Scale Machine Learning》中的下圖所示:
對於遠離分類平面的點值為0;對於邊緣上的點值在 [0, 1/L],其中,L為訓練數據集個數,即數據集大小;對於 outline 數據和內部的數據值為 1/L。
OK,繼續回到問題,我們原來的約束條件為:
現在考慮到 outlier 問題,約束條件變成了:
其中,ξi >= 0 稱為鬆弛變數(slack variable),對應數據點 xi 允許偏離的 functional margin 的量。當然,如果我們運行 ξi 任意大的話,那任意的超平面都是符合條件的了。所以,我們在原來的目標函數後面加上一項,使得這些 ξi 的總和也要最小,即軟間隔支援向量機的學習問題如下(原始問題):
其中 C是懲罰係數,用於控制目標函數中兩項(「尋找 margin 最大的超平面」 和 「保證數據點偏差量最小」)之間的權重。注意,其中 ξ 是需要優化的變數(之一),而 C 是一個事先確定好的常量,C值大時對誤分類的懲罰增加(C趨於很大時,意味著分類嚴格不能有錯誤),C值小時對誤分類的懲罰減小(C趨於很小時,意味著可以有更大的錯誤容忍)。完整的寫出來是這個樣子:
所以上式包含兩層含義,使 ||w||2/2 盡量小即間隔盡量大,同時使誤分類點的個數盡量小,C是調和兩者的係數,有了上式,就可以和線性可分支援向量機一樣考慮線性可分支援向量機一樣考慮線性支援向量機的學習過程,此時,線性不可分支援向量機的學習問題可以變為之前的凸二次規劃問題的求解。
用之前的方法將限制或約束條件加入到目標函數中,得到新的拉格朗日函數,如下所示:
約束如下:
分析方法和前面一樣,轉換為另一個問題之後,解法類似,我們先讓 L 針對 w, b 和 ξ 最小化:
將 w 帶回 L 並化簡,得到和原來一樣的目標函數:
不過由於我們得到 C – αi – ri = 0 而 又有 ri >= 0 (作為 Lagrange multiplier 的條件),因此有 αi <= C,所以整個 dual 問題現在寫作:
把前後的結果對比一下:
可以看到唯一的區別就是現在 dual varibale α 多了一個上限 C。而 Kernel 化的非線性形式也是一樣的,只要把 <xi, xj> 換成 k(xi, xj)即可。這樣一來,一個完整的可以處理線性和非線性並能容忍噪音和 outliers 的支援向量機就介紹完畢了。
所以可以做一個總結,不準確的說:SVM它本質上是一個分類方法,用 WT+b 定義分類函數,於是求 w,b為尋最大間隔,引出 1 / 2 || w || ^2,繼而引入拉格朗日因子,化為對拉格朗日乘子a 的求解(求解過程中會設計一系列的最優化或凸二次規劃等問題),如此,求 w.b 與 求 a 等價,而 a 的求解可以用一種快速學習演算法 SMO,至於核函數,是為了處理非線性問題,若直接映射到高維計算恐維度爆炸,故在低維計算,等效高維表現。
10,支援向量機(SVM)的優缺點
支援向量機(SVM)是一組用於分類,回歸和異常值檢測的監督學習方法。
10.1 支援向量機(SVM)的優點:
- 在高維空間有效
- 在維度數量大於樣本數量的情況下仍然有效
- 在決策功能(稱為支援向量)中使用訓練點的子集,因此他也是記憶體有效的
- 多功能:可以為決策功能指定不同的內核函數。提供通過內核,也可以指定自定義內核
10.2 支援向量機(SVM)的缺點:
- 如果特徵數量遠遠大於樣本數量,則該方法可能會導致交叉的性能
- 支援向量機不直接提供概率估計,這些是使用昂貴的五折交叉驗證計算的
知識儲備1:什麼叫凸優化?
我們可以看到,上麵線性可分支援向量機模型的最優化問題如下:
上面的基本型目標函數是二次的,約束條件是線性的,這是一個凸二次規劃問題。可以直接用現成的優化計算包求解。但若利用「對偶問題」來求解,會更高效。
- 啥是凸?什麼是凸優化?
凸優化說的是這樣一回事情:
凸優化可以想像成給我一個凸函數,我們需要找最低點。
- 為啥叫二次規劃問題呢?
據了解。目標函數和約束條件都為變數的線性函數,叫做——線性規劃問題。目標函數為變數的二次函數和約束條件為變數的線性函數,叫做二次規劃問題。
拉格朗日對偶性,即通過給每一個約束條件加上一個拉格朗日乘子。然後定義出拉格朗日函數,通過拉格朗日函數將約束條件融合進目標函數中。目的是,只需要通過一個目標函數包含約束條件,便可以解釋清楚問題。
知識儲備2:有約束最優化問題的數學模型
SVM 問題是一個不等式約束條件下的優化問題。絕大多數模式識別教程在討論這個問題時都會加上優化演算法的簡介。
2.1 有約束優化問題的幾何意向
約束條件一般分為等式約束和不等式約束,前者表示為 g(x) = 0 ;後者表示為 g(x) <= 0、
假設 x 屬於 Rd(就是這個向量一共有 d 個標量組成),則 g(x) = 0 則是由 d-1 維的超平面。那麼有約束優化問題就要求在這個 d-1 維的曲面或者超平面上找到能使得目標函數最小的點,這個 d-1 維的曲面就是「可行解區域」。
對於不等式約束條件, g(x) <= 0 ,則可行解區域 d-1 維曲面擴展成 d 維空間的一個子集。我們可以從 d=2 的二維空間進行比對理解。等式約束對應的可行解空間就是一條線;不等式約束對應的則是這條線以及線的某一側對應的區域,就像下面的這幅圖(圖中的模板函數等高線其實就是等值線,在同一條等值線上的點對應的目標函數值相等)。
2.2 拉格朗日乘子法
儘管上面我們已經想像出有約束優化問題的幾何意向。可是如何利用代數方法找到這個被約束了的最優解呢?這就需要用到拉格朗日乘子法。
首先定義原始目標函數 f(x),拉格朗日乘子法的基本思想是把約束條件轉換為新的目標函數 L(x, λ) 的一部分,從而使有約束優化問題變成我們習慣的無約束優化問題,那麼該如何去改造原來的目標函數 f(x),使得新的目標函數 L(x, λ) 的最優解恰好在可行解區域中呢?這就需要我們去分析可行解區域的最優解的特點。
知識儲備3:KKT條件
KKT條件是一個線性規劃問題能有最優解的充分和必要條件。
對於不等式約束條件 g(x) <= 0 的情況,如下圖所示,最優解所在的位置 x* 有兩種可能,或者在邊界曲線 g(x)=0 上或者在可行解區域內部滿足不等式 g(x) < 0 的地方。
第一種情況:最優解在邊界上,就相當於約束條件就是 g(x) = 0.參考下圖,注意此時的目標函數 f(x) 的最優解是在可行解區域外面,所以函數 f(x) 在最優解 x* 附加的變化趨勢是「在可行解區域內側較大而在區域外側較小」,與之對應的是函數 g(x) 在可行解區域內小於 0 ,在區域外大於零,所以在最優解 x* 附加的變換趨勢是內部較小而外部較大。這意味著目標函數 f(x) 的梯度方向與約束條件函數 g(x) 的梯度方向相反。因此根據下式,可以推斷出參數 λ > 0。
一般的,一個最優化數學模型可以表示成如下形式:
h(x) 是等式約束,g(x)是不等式約束,p, q表示約束的數量。
而這個最優化數學模型的最優解 x* 需滿足的條件(即KTT條件)為:
參考文獻:
//zhuanlan.zhihu.com/p/31652569
//zhuanlan.zhihu.com/p/57648645
//www.360doc.com/content/18/0727/00/7669533_773495537.shtml
//blog.csdn.net/qq_35992440/article/details/80987664
//zhuanlan.zhihu.com/p/24638007
//blog.csdn.net/weixin_40170902/article/details/80113128