最近一直在學習SVM, 想着幹脆就徹底的把讀書的時候不會的東西弄明白, 是以把july 的SVM詳解仔細看了以下, 然後又看了兩次台大的SVM教學視訊,終于對SVM有了比較透徹的了解, 是以在這裡轉載一下july的SVM, 并且在一些地方添加了一下自己的了解,希望能夠與大家分享一下。
文中添加注解的地方,以以下标志開始和結束
-------------------------------------------------------------------------------------------------------
comments by watkins:
-------------------------------------------------------------------------------------------------------
這裡我做不到像july那樣讀那麼多的參考資料,需要工作,沒那麼多時間,我所需要的,就是了解基本的SVM推到過程,然後知道在使用的時候如何優化就可以了。
原文位址: http://blog.csdn.net/v_july_v/article/details/7624837
關于SVM的應用,暫時還沒有,稍候給出。
支援向量機通俗導論(了解SVM的三層境界)
作者: July ; 緻謝: pluskid、 白石、J erryLead。
出處:結構之法算法之道 blog 。
前言
動筆寫這個支援向量機(support vector machine)是費了不少勁和困難的,原因很簡單,一者這個東西本身就并不好懂,要深入學習和研究下去需花費不少時間和精力,二者這個東西也不好講清楚,盡管網上已經有朋友寫得不錯了(見文末參考連結),但在描述數學公式的時候還是顯得不夠。得益于同學白石的數學證明,我還是想嘗試寫一下,希望本文在兼顧通俗易懂的基礎上,真真正正能足以成為一篇完整概括和介紹支援向量機的導論性的文章。
本文在寫的過程中,參考了不少資料,包括《支援向量機導論》、《統計學習方法》及網友pluskid的支援向量機系列等等,于此,還是一篇學習筆記,隻是加入了自己的了解和總結,有任何不妥之處,還望海涵。全文宏觀上整體認識支援向量機的概念和用處,微觀上深究部分定理的來龍去脈,證明及原理細節,力保邏輯清晰 & 通俗易懂。
同時,閱讀本文時建議大家盡量使用chrome等浏覽器,如此公式才能更好的顯示,再者,閱讀時可拿張紙和筆出來,把本文所有定理.公式都親自推導一遍或者直接列印下來(可直接列印網頁版或本文文末附的PDF,享受随時随地思考、演算的極緻快感),在文稿上演算。
Ok,還是那句原話,有任何問題,歡迎任何人随時不吝指正 & 賜教,感謝。
第一層、了解SVM
支援向量機,因其英文名為support vector machine,故一般簡稱SVM,通俗來講,它是一種二類分類模型,其基本模型定義為特征空間上的間隔最大的線性分類器,其學習政策便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。
1.1、分類标準的起源:Logistic回歸
了解SVM,咱們必須先弄清楚一個概念:線性分類器。
給定一些資料點,它們分别屬于兩個不同的類,現在要找到一個線性分類器把這些資料分成兩類。如果用x表示資料點,用y表示類别(y可以取1或者-1,分别代表兩個不同的類),一個線性分類器的學習目标便是要在n維的資料空間中找到一個超平面(hyper plane),這個超平面的方程可以表示為( wT中的T代表轉置):
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNwkDNwETMwIzNwETMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
可能有讀者對類别取1或-1有疑問,事實上,這個1或-1的分類标準起源于logistic回歸。
Logistic回歸目的是從特征學習出一個0/1分類模型,而這個模型是将特性的線性組合作為自變量,由于自變量的取值範圍是負無窮到正無窮。是以,使用logistic函數(或稱作sigmoid函數)将自變量映射到(0,1)上,映射後的值被認為是屬于y=1的機率。
假設函數
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中x是n維特征向量,函數g就是logistic函數。 而
的圖像是
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
可以看到,将無窮映射到了(0,1)。 而假設函數就是特征屬于y=1的機率。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
進而,當我們要判别一個新來的特征屬于哪個類時,隻需求
即可,若
大于0.5就是y=1的類,反之屬于y=0類。
此外,
隻和
有關,
>0,那麼
,而g(z)隻是用來映射,真實的類别決定權還是在于
。再者,當
時,
=1,反之
=0。如果我們隻從
出發,希望模型達到的目标就是讓訓練資料中y=1的特征
,而是y=0的特征
。Logistic回歸就是要學習得到
,使得正例的特征遠大于0,負例的特征遠小于0,而且要在全部訓練執行個體上達到這個目标。
接下來,嘗試把logistic回歸做個變形。首先,将使用的結果标簽y = 0和y = 1替換為y = -1,y = 1,然後将
(
)中的
替換為b,最後将後面的
替換為
(即
)。如此,則有了
。也就是說除了y由y=0變為y=-1外,線性分類函數跟logistic回歸的形式化表示
沒差別。
進一步,可以将假設函數
中的g(z)做一個簡化,将其簡單映射到y=-1和y=1上。映射關系如下:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
1.2、線性分類的一個例子
下面舉個簡單的例子,如下圖所示,現在有一個二維平面,平面上有兩種不同的資料,分别用圈和叉表示。由于這些資料是線性可分的,是以可以用一條直線将這兩類資料分開,這條直線就相當于一個超平面,超平面一邊的資料點所對應的y全是 -1 ,另一邊所對應的y全是1。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這個超平面可以用分類函數
表示,當f(x) 等于0的時候,x便是位于超平面上的點,而f(x)大于0的點對應 y=1 的資料點,f(x)小于0的點對應y=-1的點,如下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
注:有的資料上定義特征到結果的輸出函數
,與這裡定義的
實質是一樣的。為什麼?因為無論是
,還是
,不影響最終優化結果。下文你将看到,當我們轉化到優化
的時候,為了求解友善,會把yf(x)令為1,即yf(x)是y(w^x + b),還是y(w^x - b),對我們要優化的式子max1/||w||已無影響。
(有一朋友飛狗來自Mare_Desiderii,看了上面的定義之後,問道:請教一下SVM functional margin 為
=y(wTx+b)=yf(x)中的Y是隻取1和-1 嗎?y的唯一作用就是確定functional margin的非負性?真是這樣的麼?當然不是,詳情請見本文評論下第43樓)
當然,有些時候,或者說大部分時候資料并不是線性可分的,這個時候滿足這樣條件的超平面就根本不存在(不過關于如何處理這樣的問題我們後面會講),這裡先從最簡單的情形開始推導,就假設資料都是線性可分的,亦即這樣的超平面是存在的。
換言之,在進行分類的時候,遇到一個新的資料點x,将x代入f(x) 中,如果f(x)小于0則将x的類别賦為-1,如果f(x)大于0則将x的類别賦為1。
接下來的問題是,如何确定這個超平面呢?從直覺上而言,這個超平面應該是最适合分開兩類資料的直線。而判定“最适合”的标準就是這條直線離直線兩邊的資料的間隔最大。是以,得尋找有着最大間隔的超平面。
1.3、函數間隔Functional margin與幾何間隔Geometrical margin
在超平面w*x+b=0确定的情況下,|w*x+b|能夠表示點x到距離超平面的遠近,而通過觀察w*x+b的符号與類标記y的符号是否一緻可判斷分類是否正确,是以,可以用(y*(w*x+b))的正負性來判定或表示分類的正确性。于此,我們便引出了函數間隔(functional margin)的概念。
定義函數間隔(用
表示)為:
而超平面(w,b)關于T中所有樣本點(xi,yi)的函數間隔最小值(其中,x是特征,y是結果标簽,i表示第i個樣本),便為超平面(w, b)關于訓練資料集T的函數間隔:
= min![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) i (i=1,...n)![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
但這樣定義的函數間隔有問題,即如果成比例的改變w和b(如将它們改成2w和2b),則函數間隔的值f(x)卻變成了原來的2倍(雖然此時超平面沒有改變),是以隻有函數間隔還遠遠不夠。
事實上,我們可以對法向量w加些限制條件,進而引出真正定義點到超平面的距離--幾何間隔(geometrical margin)的概念。
假定對于一個點 x ,令其垂直投影到超平面上的對應點為 x0 ,w 是垂直于超平面的一個向量,
為樣本x到分類間隔的距離,如下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
有
,其中||w||表示的是範數。
又由于 x0 是超平面上的點,滿足 f(x0)=0 ,代入超平面的方程
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNwkDNwETMwIzNwETMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
即可算出:
γ
(有的書上會寫成把||w|| 分開相除的形式,如本文參考文獻及推薦閱讀條目11,其中,||w||為w的二階泛數)
為了得到
的絕對值,令
乘上對應的類别 y,即可得出幾何間隔(用
表示)的定義:
從上述函數間隔和幾何間隔的定義可以看出:幾何間隔就是函數間隔除以||w||,而且函數間隔y*(wx+b) = y*f(x)實際上就是|f(x)|,隻是人為定義的一個間隔度量,而幾何間隔|f(x)|/||w||才是直覺上的點到超平面的距離。
1.4、最大間隔分類器Maximum Margin Classifier的定義
對一個資料點進行分類,當超平面離資料點的“間隔”越大,分類的确信度(confidence)也越大。是以,為了使得分類的确信度盡量高,需要讓所選擇的超平面能夠最大化這個“間隔”值。這個間隔如下圖中的gap / 2所示。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
通過由前面的分析可知:函數間隔不适合用來最大化間隔值,因為在超平面固定以後,可以等比例地縮放w的長度和b的值,這樣可以使得
的值任意大,亦即函數間隔
可以在超平面保持不變的情況下被取得任意大。但幾何間隔因為除上了
,使得在縮放w和b的時候幾何間隔
的值是不會改變的,它隻随着超平面的變動而變動,是以,這是更加合适的一個間隔。是以,這裡要找的最大間隔分類超平面中的“間隔”指的是幾何間隔。
于是最大間隔分類器(maximum margin classifier)的目标函數可以定義為:
同時需滿足一些條件,根據間隔的定義,有
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中,s.t.,即subject to的意思,它導出的是限制條件。
回顧下幾何間隔的定義
可知:如果令函數間隔
等于1(之是以令
等于1,是為了友善推導和優化,且這樣做對目标函數的優化沒有影響,至于為什麼,請見本文評論下第42樓回複),則有
= 1 / ||w||且
,進而上述目标函數轉化成了
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這個目标函數便是在相應的限制條件
下,最大化這個1/||w||值,而1/||w||便是幾何間隔
。
如下圖所示,中間的實線便是尋找到的最優超平面(Optimal Hyper Plane),其到兩條虛線的距離相等,這個距離便是幾何間隔
,兩條虛線之間的距離等于2
,而虛線上的點則是支援向量。由于這些支援向量剛好在邊界上,是以它們滿足
(還記得我們把 functional margin 定為 1 了嗎?上節中:處于友善推導和優化的目的,我們可以令
=1),而對于所有不是支援向量的點,則顯然有
。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
OK,到此為止,算是了解到了SVM的第一層,對于那些隻關心怎麼用SVM的朋友便已足夠,不必再更進一層深究其更深的原理。
-------------------------------------------------------------------------------------------------------
comments by watkins:
這裡,關于為什麼要推導出以及如何推到出
這個公式,本文是通過最大分割邊界來推到的,本文中使用了函數距離和幾何距離,并且發現了函數距離和幾何距離之間的關系。通過使得margin最大,能後得到的經驗誤差最小來實作最好的分類器,并且為了計算友善,定義函數距離
為1,那麼就會得到幾何距離
= 1 / ||w||, 這樣就得到了我們以後需要進行優化的一個目标,使得這個目标最大。
這種了解方法很巧妙,在台大的視訊中,還有另外一種更加直接的了解。如下,
因為w可以了解為找到的超平面的法向量,是以計算一個樣本x 到hyperplane的距離,就可以通過在這個超平面中随便找一點 x' , 然後計算x 與 x'構成的向量在超平面的法向量w上的投影, 這樣可以直接計算一個特征點 x 到超平面的距離:
我們的目的是使得所有的點到超平面的距離中的最小值最大化, 也就是是margin最大,這樣采用這個超平面進行分類才能實作經驗風險最小化,也就是能容忍更多的誤差。同樣也意味着找到最寬的分割線。。。(這種了解隻适合在二維的特征中)
上面的距離公式,可以根據以下的推到改寫:
然後, 有了距離公式, 我們發現一個函數可以進行縮放的,也就是說給每個參數都乘以相同的因子,還是一樣的函數,是以可以進行一些縮放操作,友善計算:
這樣,使得margin 的值就為:
, 我們需要做的,就是讓這個值最大化
-------------------------------------------------------------------------------------------------------
第二層、深入SVM
2.1、從線性可分到線性不可分
2.1.1、從原始問題到對偶問題的求解
接着考慮之前得到的目标函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
由于求
的最大值相當于求
的最小值,是以上述目标函數等價于(w由分母變成分子,進而也有原來的max問題變為min問題,很明顯,兩者問題等價):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
因為現在的目标函數是二次的,限制條件是線性的,是以它是一個凸二次規劃問題。這個問題可以用現成的QP (Quadratic Programming) 優化包進行求解。一言以蔽之:在一定的限制條件下,目标最優,損失最小。
此外,由于這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange Duality)變換到對偶變量 (dual variable) 的優化問題,即通過求解與原問題等價的對偶問題(dual problem)得到原始問題的最優解,這就是線性可分條件下支援向量機的對偶算法,這樣做的優點在于:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。
那什麼是拉格朗日對偶性呢?簡單來講,通過給每一個限制條件加上一個拉格朗日乘子(Lagrange multiplier)
,定義拉格朗日函數(通過拉格朗日函數将限制條件融合到目标函數裡去,進而隻用一個函數表達式便能清楚的表達出我們的問題):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
然後令
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
容易驗證,當某個限制條件不滿足時,例如
,那麼顯然有
(隻要令
即可)。而當所有限制條件都滿足時,則有
,亦即最初要最小化的量。
是以,在要求限制條件得到滿足的情況下最小化
,實際上等價于直接最小化
(當然,這裡也有限制條件,就是
≥0,i=1,…,n ) ,因為如果限制條件沒有得到滿足,
會等于無窮大,自然不會是我們所要求的最小值。
具體寫出來,目标函數變成了:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這裡用
表示這個問題的最優值,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對w和b兩個參數,而
又是不等式限制,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用
來表示。而且有
≤
,在滿足某些條件的情況下,這兩者相等,這個時候就可以通過求解對偶問題來間接地求解原始問題。
換言之,之是以從minmax的原始問題
,轉化為maxmin的對偶問題
,一者因為
是
的近似解,二者,轉化為對偶問題後,更容易求解。
下面可以先求L 對w、b的極小,再求L 對
的極大。
2.1.2、KKT條件
上文中提到“
≤
在滿足某些條件的情況下,兩者等價”,這所謂的“滿足某些條件”就是要滿足KKT條件。
一般地,一個最優化數學模型能夠表示成下列标準形式:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中,f(x)是需要最小化的函數,h(x)是等式限制,g(x)是不等式限制,p和q分别為等式限制和不等式限制的數量。
同時,得明白以下兩點:
- 凸優化的概念: 為一凸集,
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 為一凸函數。凸優化就是要找出一點轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,使得每一轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 滿足轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - KKT條件的意義:它是一個非線性規劃(Nonlinear Programming)問題能有最優化解法的必要和充分條件。
而KKT條件就是指上面最優化數學模型的标準形式中的最小點 x* 必須滿足下面的條件:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
經過論證,我們這裡的問題是滿足 KKT 條件的(首先已經滿足Slater condition,再者f和gi也都是可微的,即L對w和b都可導),是以現在我們便轉化為求解第二個問題。
也就是說,原始問題通過滿足KKT條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分為3個步驟:首先要讓L(w,b,a) 關于 w 和 b 最小化,然後求對
的極大,最後利用SMO算法求解對偶問題中的拉格朗日乘子。
2.1.3、對偶問題求解的3個步驟
(1)、首先固定
,要讓 L 關于 w 和 b 最小化,我們分别對w,b求偏導數,即令 ∂L/∂w 和 ∂L/∂b 等于零(對w求導結果的解釋請看本文評論下第45樓回複):
将以上結果代入之前的L,得到 :
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
進而有:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
提醒:有讀者可能會問上述推導過程如何而來?說實話,其具體推導過程是比較複雜的,如下圖所示:
最後,得到:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
如 jerrylead所說:“倒數第4步”推導到“倒數第3步”使用了線性代數的轉置運算,由于ai和yi都是實數,是以轉置後與自身一樣。“倒數第3步”推導到“倒數第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法運算法則。最後一步是上一步的順序調整。
L(
從上面的最後一個式子,我們可以看出,此時的拉格朗日函數隻包含了一個變量,那就是
(求出了
便能求出w,和b,由此可見,上文第1.2節提出來的核心問題:分類函數
也就可以輕而易舉的求出來了)。
(2)、求對
的極大,即是關于對偶問題的最優化問題。經過上面第一個步驟的求w和b,得到的拉格朗日函數式子已經沒有了變量w,b,隻有
。從上面的式子得到:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這樣, 求出了
,根據
,
即可求出w, 然後通過
, 即可求出b, 最終得出分離超平面和分類決策函數。
(3)在求得L(w, b, a) 關于 w 和 b 最小化,以及對
的極大之後,最後一步便是利用SMO算法求解對偶問題中的拉格朗日乘子
。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
上述式子要解決的是在參數
上求最大值W的問題,至于
和
都是已知數。要了解這個SMO算法是如何推導的,請跳到下文第3.5節、SMO算法。 到目前為止,我們的 SVM 還比較弱,隻能處理線性的情況,下面我們将引入核函數,進而推廣到非線性分類問題。
2.1.5、線性不可分的情況
OK,為過渡到下節2.2節所介紹的核函數,讓我們再來看看上述推導過程中得到的一些有趣的形式。首先就是關于我們的 hyper plane ,對于一個資料點 x 進行分類,實際上是通過把 x 帶入到
算出結果然後根據其正負号來進行類别劃分的。而前面的推導中我們得到
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
是以分類函數為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這裡的形式的有趣之處在于,對于新點 x的預測,隻需要計算它與訓練資料點的内積即可(
表示向量内積),這一點至關重要,是之後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裡顯示出來——事實上,所有非Supporting Vector 所對應的系數
都是等于零的,是以對于新點的内積計算實際上隻要針對少量的“支援向量”而不是所有的訓練資料即可。
為什麼非支援向量對應的
等于零呢?直覺上來了解的話,就是這些“後方”的點——正如我們之前分析過的一樣,對超平面是沒有影響的,由于分類完全有超平面決定,是以這些無關的點并不會參與分類問題的計算,因而也就不會産生任何影響了。
回憶一下我們2.1.1節中通過 Lagrange multiplier得到的目标函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
注意到如果 xi 是支援向量的話,上式中紅顔色的部分是等于 0 的(因為支援向量的 functional margin 等于 1 ),而對于非支援向量來說,functional margin 會大于 1 ,是以紅顔色部分是大于零的,而
又是非負的,為了滿足最大化,
必須等于 0 。這也就是這些非Supporting Vector 的點的局限性。
從1.5節到上述所有這些東西,便得到了一個maximum margin hyper plane classifier,這就是所謂的支援向量機(Support Vector Machine)。當然,到目前為止,我們的 SVM 還比較弱,隻能處理線性的情況,不過,在得到了對偶dual 形式之後,通過 Kernel 推廣到非線性的情況就變成了一件非常容易的事情了(相信,你還記得本節開頭所說的:“通過求解對偶問題得到最優解,這就是線性可分條件下支援向量機的對偶算法,這樣做的優點在于:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題”)。
2.2、核函數Kernel
2.2.1、特征空間的隐式映射:核函數
咱們首先給出核函數的來頭:在上文中,我們已經了解到了SVM處理線性可分的情況,而對于非線性的情況,SVM 的處理方法是選擇一個核函數 κ(⋅,⋅) ,通過将資料映射到高維空間,來解決在原始空間中線性不可分的問題。
此外,因為訓練樣例一般是不會獨立出現的,它們總是以成對樣例的内積形式出現,而用對偶形式表示學習器的優勢在為在該表示中可調參數的個數不依賴輸入屬性的個數,通過使用恰當的核函數來替代内積,可以隐式得将非線性的訓練資料映射到高維空間,而不增加可調參數的個數(當然,前提是核函數能夠計算對應着兩個輸入特征向量的内積)。
線上性不可分的情況下,支援向量機首先在低維空間中完成計算,然後通過核函數将輸入空間映射到高維特征空間,最終在高維特征空間中構造出最優分離超平面,進而把平面上本身不好分的非線性資料分開。如圖7-7所示,一堆資料在二維空間無法劃分,進而映射到三維空間裡劃分:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
而在我們遇到核函數之前,如果用原始的方法,那麼在用線性學習器學習一個非線性關系,需要選擇一個非線性特征集,并且将資料寫成新的表達形式,這等價于應用一個固定的非線性映射,将資料映射到特征空間,在特征空間中使用線性學習器,是以,考慮的假設集是這種類型的函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這裡 ϕ:X->F是從輸入空間到某個特征空間的映射,這意味着建立非線性學習器分為兩步:
- 首先使用一個非線性映射将資料變換到一個特征空間F,
- 然後在特征空間使用線性學習器分類。
而由于對偶形式就是線性學習器的一個重要性質,這意味着假設可以表達為訓練點的線性組合,是以決策規則可以用測試點和訓練點的内積來表示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
如果有一種方式可以 在特征空間中直接計算内積〈φ(xi · φ(x) 〉,就像在原始輸入點的函數中一樣,就有可能将兩個步驟融合到一起建立一個非線性的學習器,這樣直接計算法的方法稱為核函數方法: 核是一個函數K,對所有x,z(-X,滿足
,這裡 φ是從X到内積特征空間F的映射。
2.2.2、核函數:如何處理非線性資料
來看個核函數的例子。如下圖所示的兩類資料,分别分布為兩個圓圈的形狀,這樣的資料本身就是線性不可分的,此時咱們該如何把這兩類資料分開呢(下文将會有一個相應的三維空間圖)?
事實上,上圖所述的這個資料集,是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,是以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。如果用 X1 和 X2 來表示這個二維平面的兩個坐标的話,我們知道一條二次曲線(圓圈是二次曲線的一種特殊情況)的方程可以寫作這樣的形式:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
注意上面的形式,如果我們構造另外一個五維的空間,其中五個坐标的值分别為 Z1=X1 , Z2=X21 , Z3=X2 , Z4=X22 , Z5=X1X2 ,那麼顯然,上面的方程在新的坐标系下可以寫作:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
關于新的坐标 Z ,這正是一個 hyper plane 的方程!也就是說,如果我們做一個映射 ϕ:R2→R5 ,将 X 按照上面的規則映射為 Z ,那麼在新的空間中原來的資料将變成線性可分的,進而使用之前我們推導的線性分類算法就可以進行處理了。這正是 Kernel 方法處理非線性問題的基本思想。
再進一步描述 Kernel 的細節之前,不妨再來看看這個例子映射過後的直覺例子。當然,你我可能無法把 5 維空間畫出來,不過由于我這裡生成資料的時候就是用了特殊的情形,具體來說,我這裡的超平面實際的方程是這個樣子(圓心在 X2 軸上的一個正圓):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
是以我隻需要把它映射到 Z1=X21 , Z2=X22 , Z3=X2 這樣一個三維空間中即可,下圖即是映射之後的結果,将坐标軸經過适當的旋轉,就可以很明顯地看出,資料是可以通過一個平面來分開的(pluskid:下面的gif 動畫,先用 Matlab 畫出一張張圖檔,再用 Imagemagick 拼貼成):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
核函數相當于把原來的分類函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
映射成:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
而其中的
可以通過求解如下 dual 問題而得到的:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這樣一來問題就解決了嗎?似乎是的:拿到非線性資料,就找一個映射
,然後一股腦把原來的資料映射到新空間中,再做線性 SVM 即可。不過事實上沒有這麼簡單!其實剛才的方法稍想一下就會發現有問題:在最初的例子裡,我們對一個二維空間做映射,選擇的新空間是原始空間的所有一階和二階的組合,得到了五個次元;如果原始空間是三維,那麼我們會得到 19 維的新空間,這個數目是呈爆炸性增長的,這給
的計算帶來了非常大的困難,而且如果遇到無窮維的情況,就根本無從計算了。是以就需要 Kernel 出馬了。
不妨還是從最開始的簡單例子出發,設兩個向量
和
,而
即是到前面說的五維空間的映射,是以映射過後的内積為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
(公式說明:上面的這兩個推導過程中,所說的前面的五維空間的映射,這裡說的前面便是文中2.2.1節的所述的映射方式,回顧下之前的映射規則,再看那第一個推導,其實就是計算x1,x2各自的内積,然後相乘相加即可,第二個推導則是直接平方,去掉括号,也很容易推出來)
另外,我們又注意到:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
二者有很多相似的地方,實際上,我們隻要把某幾個次元線性縮放一下,然後再加上一個常數次元,具體來說,上面這個式子的計算結果實際上和映射
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
之後的内積
的結果是相等的,那麼差別在于什麼地方呢?
- 一個是映射到高維空間中,然後再根據内積的公式進行計算;
- 而另一個則直接在原來的低維空間中進行計算,而不需要顯式地寫出映射後的結果。
(公式說明:上面之中,最後的兩個式子,第一個算式,是帶内積的完全平方式,可以拆開,然後,通過湊一個得到,第二個算式,也是根據第一個算式湊出來的)
回憶剛才提到的映射的次元爆炸,在前一種方法已經無法計算的情況下,後一種方法卻依舊能從容處理,甚至是無窮次元的情況也沒有問題。
我們把這裡的計算兩個向量在隐式映射過後的空間中的内積的函數叫做核函數 (Kernel Function) ,例如,在剛才的例子中,我們的核函數為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
核函數能簡化映射空間中的内積運算——剛好“碰巧”的是,在我們的 SVM 裡需要計算的地方資料向量總是以内積的形式出現的。對比剛才我們上面寫出來的式子,現在我們的分類函數為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中
由如下 dual 問題計算而得:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的!當然,因為我們這裡的例子非常簡單,是以我可以手工構造出對應于
的核函數出來,如果對于任意一個映射,想要構造出對應的核函數就很困難了。
2.2.3、幾個核函數
通常人們會從一些常用的核函數中選擇(根據問題和資料的不同,選擇不同的參數,實際上就是得到了不同的核函數),例如:
- 多項式核 ,顯然剛才我們舉的例子是這裡多項式核的一個特例(R = 1,d = 2)。雖然比較麻煩,而且沒有必要,不過這個核所對應的映射實際上是可以寫出來的,該空間的次元是
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,其中轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 是原始空間的次元。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 高斯核 ,這個核就是最開始提到過的會将原始空間映射為無窮維空間的那個家夥。不過,如果
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 選得很大的話,高次特征上的權重實際上衰減得非常快,是以實際上(數值上近似一下)相當于一個低維的子空間;反過來,如果轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 選得很小,則可以将任意的資料映射為線性可分——當然,這并不一定是好事,因為随之而來的可能是非常嚴重的過拟合問題。不過,總的來說,通過調控參數轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。下圖所示的例子便是把低維線性不可分的資料通過高斯核函數映射到了高維空間:轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 線性核 ,這實際上就是原始空間中的内積。這個核存在的主要目的是使得“映射後空間中的問題”和“映射前空間中的問題”兩者在形式上統一起來了(意思是說,咱們有的時候,寫代碼,或寫公式的時候,隻要寫個模闆或通用表達式,然後再代入不同的核,便可以了,于此,便在形式上統一了起來,不用再分别寫一個線性的,和一個非線性的)。
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
2.2.4、核函數的本質
上面說了這麼一大堆,讀者可能還是沒明白核函數到底是個什麼東西?我再簡要概括下,即以下三點:
- 實際中,我們會經常遇到線性不可分的樣例,此時,我們的常用做法是把樣例特征映射到高維空間中去(如上文2.2節最開始的那幅圖所示,映射到高維空間後,相關特征便被分開了,也就達到了分類的目的);
- 但進一步,如果凡是遇到線性不可分的樣例,一律映射到高維空間,那麼這個次元大小是會高到可怕的(如上文中19維乃至無窮維的例子)。那咋辦呢?
- 此時,核函數就隆重登場了,核函數的價值在于它雖然也是講特征進行從低維到高維的轉換,但核函數絕就絕在它事先在低維上進行計算,而将實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的複雜計算。
最後引用這裡的一個例子舉例說明下核函數解決非線性問題的直覺效果。
假設現在你是一個農場主,圈養了一批羊群,但為預防狼群襲擊羊群,你需要搭建一個籬笆來把羊群圍起來。但是籬笆應該建在哪裡呢?你很可能需要依據牛群和狼群的位置建立一個“分類器”,比較下圖這幾種不同的分類器,我們可以看到SVM完成了一個很完美的解決方案。
這個例子從側面簡單說明了SVM使用非線性分類器的優勢,而邏輯模式以及決策樹模式都是使用了直線方法。
OK, 不再做過多介紹了,對核函數有進一步興趣的,還可以看看此文。
2.3、使用松弛變量處理 outliers 方法
在本文第一節最開始讨論支援向量機的時候,我們就假定,資料是線性可分的,亦即我們可以找到一個可行的超平面将資料完全分開。後來為了處理非線性資料,在上文2.2節使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的的情況也能處理。雖然通過映射
将原始資料映射到高維空間之後,能夠線性分隔的機率大大增加,但是對于某些情況還是很難處理。
例如可能并不是因為資料本身是非線性結構的,而隻是因為資料有噪音。對于這種偏離正常位置很遠的資料點,我們稱之為 outlier ,在我們原來的 SVM 模型裡,outlier 的存在有可能造成很大的影響,因為超平面本身就是隻有少數幾個 support vector 組成的,如果這些 support vector 裡又存在 outlier 的話,其影響就很大了。例如下圖:
用黑圈圈起來的那個藍點是一個 outlier ,它偏離了自己原本所應該在的那個半空間,如果直接忽略掉它的話,原來的分隔超平面還是挺好的,但是由于這個 outlier 的出現,導緻分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這隻是一個示意圖,并沒有嚴格計算精确坐标),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們将無法構造出能将資料分開的超平面來。
為了處理這種情況,SVM 允許資料點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面上,而不會使得超平面發生變形了。
插播下一位讀者@Copper_PKU的了解:“換言之,在有松弛的情況下outline點也屬于支援向量SV,同時,對于不同的支援向量,拉格朗日參數的值也不同,如此篇論文《Large Scale Machine Learning》中的下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
對于遠離分類平面的點值為0;對于邊緣上的點值在[0, 1/L]之間,其中,L為訓練資料集個數,即資料集大小;對于outline資料和内部的資料值為1/L。更多請參看本文文末參考條目第51條。”
OK,繼續回到咱們的問題。我們,原來的限制條件為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
現在考慮到outlier問題,限制條件變成了:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中
稱為松弛變量 (slack variable) ,對應資料點
允許偏離的 functional margin 的量。當然,如果我們運作
任意大的話,那任意的超平面都是符合條件的了。是以,我們在原來的目标函數後面加上一項,使得這些
的總和也要最小:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中
是一個參數,用于控制目标函數中兩項(“尋找 margin 最大的超平面”和“保證資料點偏差量最小”)之間的權重。注意,其中
是需要優化的變量(之一),而
是一個事先确定好的常量。完整地寫出來是這個樣子:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
用之前的方法将限制或限制條件加入到目标函數中,得到新的拉格朗日函數,如下所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
分析方法和前面一樣,轉換為另一個問題之後,我們先讓
針對
、
和
最小化:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
将
帶回
并化簡,得到和原來一樣的目标函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
不過,由于我們得到
而又有
(作為 Lagrange multiplier 的條件),是以有
,是以整個 dual 問題現在寫作:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
把前後的結果對比一下(錯誤修正:圖中的Dual formulation中的Minimize應為maxmize):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
可以看到唯一的差別就是現在 dual variable
多了一個上限
。而 Kernel 化的非線性形式也是一樣的,隻要把
換成
即可。這樣一來,一個完整的,可以處理線性和非線性并能容忍噪音和 outliers 的支援向量機才終于介紹完畢了。
行文至此,可以做個小結,不準确的說,SVM它本質上即是一個分類方法,用w^T+b定義分類函數,于是求w、b,為尋最大間隔,引出1/2||w||^2,繼而引入拉格朗日因子,化為對拉格朗日乘子a的求解(求解過程中會涉及到一系列最優化或凸二次規劃等問題),如此,求w.b與求a等價,而a的求解可以用一種快速學習算法SMO,至于核函數,是為處理非線性情況,若直接映射到高維計算恐次元爆炸,故在低維計算,等效高維表現。
OK,了解到這第二層,已經能滿足絕大部分人一窺SVM原理的好奇心,然對于那些想在證明層面了解SVM的則還很不夠,但進入第三層了解境界之前,你必須要有比較好的數理基礎和邏輯證明能力,不然你會跟我一樣,吃不少苦頭的。
第三層、證明SVM
說實話,凡是涉及到要證明的東西.理論,便一般不是怎麼好惹的東西。絕大部分時候,看懂一個東西不難,但證明一個東西則需要點數學功底,進一步,證明一個東西也不是特别難,難的是從零開始發明創造這個東西的時候,則顯艱難(因為任何時代,大部分人的研究所得都不過是基于前人的研究成果,前人所做的是開創性工作,而這往往是最艱難最有價值的,他們被稱為真正的先驅。牛頓也曾說過,他不過是站在巨人的肩上。你,我則更是如此)。
正如陳希孺院士在他的著作《數理統計學簡史》的第4章、最小二乘法中所講:在科研上諸多觀念的革新和突破是有着很多的不易的,或許某個定理在某個時期由某個人點破了,現在的我們看來一切都是理所當然,但在一切沒有發現之前,可能許許多多的頂級學者畢其功于一役,耗盡一生,努力了幾十年最終也是無功而返。
話休絮煩,要證明一個東西先要弄清楚它的根基在哪,即構成它的基礎是哪些理論。OK,以下内容基本是上文中未講到的一些定理的證明,包括其背後的邏輯、來源背景等東西,還是讀書筆記。
本部分導述
- 3.1節線性學習器中,主要闡述感覺機算法;
- 3.2節非線性學習器中,主要闡述mercer定理;
- 3.3節、損失函數;
- 3.4節、最小二乘法;
- 3.5節、SMO算法;
- 3.6節、簡略談談SVM的應用;
3.1、線性學習器
3.1.1、感覺機算法
這個感覺機算法是1956年提出的,年代久遠,依然影響着當今,當然,可以肯定的是,此算法亦非最優,後續會有更詳盡闡述。不過,有一點,你必須清楚,這個算法是為了幹嘛的:不斷的訓練試錯以期尋找一個合适的超平面( 是的,就這麼簡單)。
下面,舉個例子。如下圖所示,憑我們的直覺可以看出,圖中的紅線是最優超平面,藍線則是根據感覺機算法在不斷的訓練中,最終,若藍線能通過不斷的訓練移動到紅線位置上,則代表訓練成功。
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
既然需要通過不斷的訓練以讓藍線最終成為最優分類超平面,那麼,到底需要訓練多少次呢?Novikoff定理告訴我們當間隔是正的時候感覺機算法會在有限次數的疊代中收斂,也就是說Novikoff定理證明了感覺機算法的收斂性,即能得到一個界,不至于無窮循環下去。
- Novikoff定理:如果分類超平面存在, 僅需在序列 上疊代幾次,在界為
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 的錯誤次數下就可以找到分類超平面,算法停止。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這裡
,
為擴充間隔。根據誤分次數公式可知, 疊代次數與對應于擴充(包括偏置)權重的訓練集的間隔有關。 順便再解釋下這個所謂的擴充間隔
,
即為樣本到分類間隔的距離,即從
引出的最大分類間隔。OK,還記得上文第1.3.2節開頭的内容麼?如下: “
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
在給出幾何間隔的定義之前,咱們首先來看下,如上圖所示,對于一個點 x ,令其垂直投影到超平面上的對應的為 x0 ,由于 w 是垂直于超平面的一個向量,
為樣本x到分類間隔的距離,我們有
”
然後後續怎麼推導出最大分類間隔請回到本文第一、二部分,此處不重複闆書。 同時有一點得注意:感覺機算法雖然可以通過簡單疊代對線性可分資料生成正确分類的超平面,但不是最優效果,那怎樣才能得到最優效果呢,就是上文中第一部分所講的尋找最大分類間隔超平面。此外,Novikoff定理的證明請見 這裡。
3.2、非線性學習器
3.2.1、Mercer定理
Mercer定理 :如果函數K是
上的映射(也就是從兩個n維向量映射到實數域)。那麼如果K是一個有效核函數(也稱為Mercer核函數),那麼當且僅當對于訓練樣例
,其相應的核函數矩陣是對稱半正定的。 要了解這個Mercer 定理,先要了解什麼是半正定矩陣,要了解什麼是半正定矩陣,先得知道什麼是 正定矩陣( 矩陣理論“博大精深”,我自己也未能徹底理清,等我理清了再續寫此節,順便推薦我正在看的一本《矩陣分析與應用》) 。然後這裡有一個此定理的證明 ,可以看下。 正如@Copper_PKU所說:核函數在SVM的分類效果中起了重要的作用,最後這裡有個tutorial可以看看。
3.3、損失函數
在本文1.0節有這麼一句話“支援向量機(SVM)是90年代中期發展起來的基于統計學習理論的一種機器學習方法,通過尋求結構化風險最小來提高學習機泛化能力,實作經驗風險和置信範圍的最小化,進而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。”但初次看到的讀者可能并不了解什麼是結構化風險,什麼又是經驗風險。要了解這兩個所謂的“風險”,還得又從監督學習說起。
監督學習實際上就是一個經驗風險或者結構風險函數的最優化問題。風險函數度量平均意義下模型預測的好壞,模型每一次預測的好壞用損失函數來度量。它從假設空間F中選擇模型f作為決策函數,對于給定的輸入X,由f(X)給出相應的輸出Y,這個輸出的預測值f(X)與真實值Y可能一緻也可能不一緻,用一個損失函數來度量預測錯誤的程度。損失函數記為L(Y, f(X))。
常用的損失函數有以下幾種(基本引用自《統計學習方法》):
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
如此,SVM有第二種了解,即最優化+損失最小,或如@夏粉_百度所說“可從損失函數和優化算法角度看SVM,boosting,LR等算法,可能會有不同收獲”。
OK,關于更多統計學習方法的問題,請參看此文。
關于損失函數,如下文讀者評論中所述:可以看看張潼的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各種算法中常用的損失函數基本都具有fisher一緻性,優化這些損失函數得到的分類器可以看作是後驗機率的“代理”。此外,張潼還有另外一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類情況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函數分析的很透徹。
3.4、最小二乘法
3.4.1、什麼是最小二乘法?
既然本節開始之前提到了最小二乘法,那麼下面引用《正态分布的前世今生》裡的内容稍微簡單闡述下。
我們口頭中經常說:一般來說,平均來說。如平均來說,不吸煙的健康優于吸煙者,之是以要加“平均”二字,是因為凡事皆有例外,總存在某個特别的人他吸煙但由于經常鍛煉是以他的健康狀況可能會優于他身邊不吸煙的朋友。而最小二乘法的一個最簡單的例子便是算術平均。
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函數比對。利用最小二乘法可以簡便地求得未知的資料,并使得這些求得的資料與實際資料之間誤差的平方和為最小。用函數表示為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
使誤差「所謂誤差,當然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作為目标函數隻是衆多可取的方法之一。
最小二乘法的一般形式可表示為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認為測量中有誤差,是以所有方程的累積誤差為
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
我們求解出導緻累積誤差最小的參數即可:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
勒讓德在論文中對最小二乘法的優良性做了幾點說明:
- 最小二乘使得誤差平方和最小,并在各個方程的誤差之間建立了一種平衡,進而防止某一個極端誤差取得支配地位
- 計算中隻要求偏導後求解線性方程組,計算過程明确便捷
- 最小二乘可以導出算術平均值作為估計值
對于最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值為 θ , x1,⋯,xn 為n次測量值, 每次測量的誤差為 ei=xi−θ ,按最小二乘法,誤差累積為
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
求解
使
達到最小,正好是算術平均
。
由于算術平均是一個曆經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,是以從另一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信心。
最小二乘法發表之後很快得到了大家的認可接受,并迅速的在資料分析實踐中被廣泛使用。不過曆史上又有人把最小二乘法的發明歸功于高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,并且聲稱自己已經使用這個方法多年。高斯發明了小行星定位的數學方法,并在資料分析中使用最小二乘方法進行計算,準确的預測了谷神星的位置。
說了這麼多,貌似跟本文的主題SVM沒啥關系呀,别急,請讓我繼續闡述。本質上說,最小二乘法即是一種參數估計方法,說到參數估計,咱們得從一進制線性模型說起。
3.4.2、最小二乘法的解法
什麼是一進制線性模型呢? 請允許我引用 這裡的内容,先來梳理下幾個基本概念:
- 監督學習中,如果預測的變量是離散的,我們稱其為分類(如決策樹,支援向量機等),如果預測的變量是連續的,我們稱其為回歸。
- 回歸分析中,如果隻包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示,這種回歸分析稱為一進制線性回歸分析。
- 如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關系,則稱為多元線性回歸分析。
- 對于二維空間線性是一條直線;對于三維空間線性是一個平面,對于多元空間線性是一個超平面...
對于一進制線性回歸模型, 假設從總體中擷取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對于平面中的這n個點,可以使用無數條曲線來拟合。要求樣本回歸函數盡可能好地拟合這組值。綜合起來看,這條直線處于樣本資料的中心位置最合理。 選擇最佳拟合曲線的标準可以确定為:使總的拟合誤差(即總殘差)達到最小。有以下三個标準可以選擇:
- 用“殘差和最小”确定直線位置是一個途徑。但很快發現計算“殘差和”存在互相抵消的問題。
- 用“殘差絕對值和最小”确定直線位置也是一個途徑。但絕對值的計算比較麻煩。
- 最小二乘法的原則是以“殘差平方和最小”确定直線位置。用最小二乘法除了計算比較友善外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。
最常用的是普通最小二乘法( Ordinary Least Square,OLS):所選擇的回歸模型應該使所有觀察值的殘差平方和達到最小,即采用平方損失函數。 我們定義樣本回歸模型為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中ei為樣本(Xi, Yi)的誤差。 接着,定義平方損失函數Q:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
則通過Q最小确定這條直線,即确定
,以
為變量,把它們看作是Q的函數,就變成了一個求極值的問題,可以通過求導數得到。 求Q對兩個待估參數的偏導數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
根據數學知識我們知道,函數的極值點為偏導為0的點。 解得:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這就是最小二乘法的解法,就是求得平方損失函數的極值點。自此,你看到求解最小二乘法與求解SVM問題何等相似,尤其是定義損失函數,而後通過偏導求得極值。
OK,更多請參看陳希孺院士的《數理統計學簡史》的第4章、最小二乘法。
3.5、SMO算法
在上文中,我們提到了求解對偶問題的序列最小最優化SMO算法,但并未提到其具體解法。首先看下最後懸而未決的問題:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
等價于求解:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
1998年,Microsoft Research的John C. Platt在論文《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》中提出針對上述問題的解法:SMO算法,它很快便成為最快的二次規劃優化算法,特别是在針對線性SVM和資料稀疏時性能更優。
接下來,咱們便參考John C. Platt的這篇文章來看看SMO的解法是怎樣的。
3.5.1、SMO算法的推導
咱們首先來定義特征到結果的輸出函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
注:這個u與我們之前定義的
實質是一樣的。
接着,重新定義下咱們原始的優化問題,權當重新回顧,如下:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
求導得到:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
代入
中,可得
。
通過引入拉格朗日乘子轉換為對偶問題後,得:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
s.t:
且
注:這裡得到的min函數與我們之前的max函數實質也是一樣,因為把符号變下,即由min轉化為max的問題,且yi也與之前的
等價,yj亦如此。
經過加入松弛變量
後,模型修改為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
進而最終我們的問題變為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
下面要解決的問題是:在
上求上述目标函數的最小值。為了求解這些乘子,每次從中任意抽取兩個乘子
和
,然後固定
和
以外的其它乘子
,使得目标函數隻是關于
和
的函數。這樣,不斷的從一堆乘子中任意抽取兩個求解,不斷的疊代求解子問題,最終達到求解原問題的目的。
而原對偶問題的子問題的目标函數可以表達為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
為了解決這個子問題,首要問題便是每次如何選取
和
。實際上,其中一個乘子是違法KKT條件最嚴重的,另外一個乘子則由另一個限制條件選取。
根據KKT條件可以得出目标函數中
取值的意義:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這裡的
還是拉格朗日乘子:
- 對于第1種情況,表明 是正常分類,在邊界内部(我們知道正确分類的點
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) );轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 對于第2種情況,表明了 是支援向量,在邊界上;
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 對于第3種情況,表明了 是在兩條邊界之間;
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
而最優解需要滿足KKT條件,即上述3個條件都得滿足,以下幾種情況出現将會出現不滿足:
- <=1但是
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) <C則是不滿足的,而原本轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) =C轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - >=1但是
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) >0則是不滿足的,而原本轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) =0轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - =1但是
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) =0或者轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) =C則表明不滿足的,而原本應該是0<轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) <C轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
也就是說,如果存在不滿足KKT條件的
,那麼需要更新這些
,這是第一個限制條件。此外,更新的同時還要受到第二個限制條件的限制,即
。
是以,如果假設選擇的兩個乘子
和
,它們在更新之前分别是
、
,更新之後分别是
、
,那麼更新前後的值需要滿足以下等式才能保證和為0的限制:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中,
是常數。
兩個因子不好同時求解,是以可先求第二個乘子
的解(
),得到
的解(
)之後,再用
的解(
)表示
的解(
)。
為了求解
,得先确定
的取值範圍。假設它的上下邊界分别為H和L,那麼有:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
接下來,綜合
和
這兩個限制條件,求取
的取值範圍。
當y1 != y2時,根據
可得
,是以有
,
,如下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
當y1 = y2時,同樣根據
可得:
,是以有
,
,如下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
如此,根據y1和y2異号或同号,可得出
的上下界分别為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
回顧下第二個限制條件
,令上式兩邊乘以y1,可得
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
其中,
。 是以
可以用
表示,
,進而把子問題的目标函數轉換為隻含
的問題:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
對
求導,可得
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
化簡下:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
然後将
、
、和
代入上式可得:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
令
(表示預測值與真實值之差),
,然後上式兩邊同時除以
,得到一個關于單變量
的解:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
這個解沒有考慮其限制條件
,即是未經剪輯時的解。 然後考慮限制
可得到經過剪輯後的
的解析解為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
求出了後
,便可以求出
,得
。
那麼如何選擇乘子
和
呢?
- 對于 ,即第一個乘子,可以通過剛剛說的那3種不滿足KKT的條件來找;
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 而對于第二個乘子 可以尋找滿足條件 :
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 的乘子。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
而b在滿足下述條件:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
下更新b:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
且每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。 最後更新所有
,y和b,這樣模型就出來了,進而即可求出咱們開頭提出的分類函數:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
此外, 這裡也有一篇類似的文章,大家可以參考下。
3.5.2、SMO算法的步驟
綜上,總結下SMO的主要步驟,如下:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
意思是,
- 第一步選取一對 和
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,選取方法使用啟發式方法;轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) - 第二步,固定除 和
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 之外的其他參數,确定W極值條件下的轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 由轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) 表示。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
假定在某一次疊代中,需要更新
,
對應的拉格朗日乘子
,
,那麼這個小規模的二次規劃問題寫為:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
那麼在每次疊代中,如何更新乘子呢?引用 這裡的兩張PPT說明下:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
知道了如何更新乘子,那麼選取哪些乘子進行更新呢?具體選擇方法有以下兩個步驟:
- 步驟1:先“掃描”所有乘子,把第一個違反KKT條件的作為更新對象,令為a2;
- 步驟2:在所有不違反KKT條件的乘子中,選擇使|E1 −E2|最大的a1進行更新,使得能最大限度增大目标函數的值(類似于梯度下降。此外 ,而
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界) ,求出來的E代表函數ui對輸入xi的預測值與真實輸出類标記yi之差)。轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
最後,每次更新完兩個乘子的優化後,都需要再重新計算b,及對應的Ei值。
綜上,SMO算法的基本思想是将Vapnik在1982年提出的Chunking方法推到極緻,SMO算法每次疊代隻選出兩個分量ai和aj進行調整,其它分量則保持固定不變,在得到解ai和aj之後,再用ai和aj改進其它分量。與通常的分解算法比較,盡管它可能需要更多的疊代次數,但每次疊代的計算量比較小,是以該算法表現出整理的快速收斂性,且不需要存儲核矩陣,也沒有矩陣運算。
3.5.3、SMO算法的實作
行文至此,我相信,SVM了解到了一定程度後,是的确能在腦海裡從頭至尾推導出相關公式的,最初分類函數,最大化分類間隔,max1/||w||,min1/2||w||^2,凸二次規劃,拉格朗日函數,轉化為對偶問題,SMO算法,都為尋找一個最優解,一個最優分類平面。一步步梳理下來,為什麼這樣那樣,太多東西可以追究,最後實作。如下圖所示:
![]()
轉載(添加自己的了解): 支援向量機通俗導論(了解SVM的三層境界)
至于下文中将闡述的核函數則為是為了更好的處理非線性可分的情況,而松弛變量則是為了糾正或限制少量“不安分”或脫離集體不好歸類的因子。
台灣的林智仁教授寫了一個封裝SVM算法的libsvm庫,大家可以看看,此外這裡還有一份libsvm的注釋文檔。
除了在這篇論文《fast training of support vector machines using sequential minimal optimization》中platt給出了SMO算法的邏輯代碼之外,這裡也有一份SMO的實作代碼,大家可以看下。
3.6、SVM的應用
或許我們已經聽到過,SVM在很多諸如文本分類,圖像分類,生物序列分析和生物資料挖掘,手寫字元識别等領域有很多的應用,但或許你并沒強烈的意識到,SVM可以成功應用的領域遠遠超出現在已經在開發應用了的領域。
3.6.1、文本分類
一個文本分類系統不僅是一個自然語言處理系統,也是一個典型的模式識别系統,系統的輸入是需要進行分類處理的文本,系統的輸出則是與文本關聯的類别。由于篇幅所限,其它更具體内容本文将不再詳述。
OK,本節雖取标題為證明SVM,但聰明的讀者們想必早已看出,其實本部分并無多少證明部分(特此緻歉),怎麼辦呢?可以參閱《支援向量機導論》一書,此書精簡而有趣。本節完。
讀者評論
本文發表後, 微網誌上的很多朋友給了不少意見,以下是節選的一些精彩評論:
- “壓力”陡增的評論→//@藏了個鋒:我是看着July大神的博文長大的啊//@zlkysl:就是看了最後那一篇才決定自己的研究方向為SVM的。--http://weibo.com/1580904460/zraWk0u6u?mod=weibotime。
- @張金輝:“SVM的三重境界,不得不轉的一篇。其實Coursera的課堂上Andrew Ng講過支援向量機,但顯然他沒有把這作為重點,加上Ng講支援向量機的方法我一時半會難以完全消化,是以聽的也是一知半解。真正開始了解支援向量機就是看的這篇“三重境界”,之後才對這個算法有了大概的概念,以至如何去使用,再到其中的原理為何,再到支援向量機的證明等。總之,這篇文章開啟了我長達數月的研究支援向量機階段,直到今日。”--http://zhan.renren.com/profile/249335584?from=template#!//tag/三重境界。
- @孤獨之守望者:"最後,推出svm的cost function 是hinge loss,然後對比其他的方法的cost function,說明其實他們的目标函數很像,那麼問題是svm為什麼這麼popular呢?您可以再加些VC dimension跟一些error bound的數學,點一下,提供一個思路和方向"。--http://weibo.com/1580904460/AiohoyDwq?mod=weibotime。
- @夏粉_百度:“在面試時,考察SVM可考察機器學習各方面能力:目标函數,優化過程,并行方法,算法收斂性,樣本複雜度,适用場景,調參經驗,不過個人認為考察boosting和LR也還不錯啊。此外,随着統計機器學習不斷進步,SVM隻被當成使用了一個替代01損失hinge研究,更通用的方法被提出,損失函數研究替代損失與貝葉斯損失關系,算法穩定性研究替代損失與推廣性能關系,凸優化研究如何求解凸目标函數,SVM,boosting等算法隻是這些通用方法的一個具體組建而已。”
- @居裡猴姐:關于SVM損失函數的問題,可以看看張潼老師的這篇《Statistical behavior and consistency of classification methods based on convex risk minimization》。各種算法中常用的損失函數基本都具有fisher一緻性,優化這些損失函數得到的分類器可以看作是後驗機率的“代理”。此外,張潼老師還有另外一篇論文《Statistical analysis of some multi-category large margin classification methods》,在多分類情況下margin loss的分析,這兩篇對Boosting和SVM使用的損失函數分析的很透徹。
- @夏粉_百度:SVM用了hinge損失,hinge損失不可導,不如其它替代損失友善優化并且轉換機率麻煩。核函數也不太用,現在是大資料時代,樣本非常大,無法想象一個n^2的核矩陣如何存儲和計算。 而且,現在現在非線性一般靠深度學習了。//@Copper_PKU:請教svm在工業界的應用典型的有哪些?工業界如何選取核函數,經驗的方法?svm的訓練過程如何優化?
- @Copper_PKU:July的svm tutorial 我個人覺得還可以加入和修改如下部分:(1) 對于支援向量解釋,可以結合圖和拉格朗日參數來表達,松弛中sv沒有寫出來. (2) SMO算法部分,加入Joachims論文中提到的算法,以及SMO算法選取workset的方法,包括SMO算法的收斂判斷,還有之前共轭梯度求解方法,雖然是較早的算法,但是對于了解SMO算法有很好的效果。模型的優化和求解都是疊代的過程,加入曆史算法增強立體感。-- http://weibo.com/1580904460/Akw6dl3Yk#_rnd1385474436177。
- //@廖臨川: 之是以sgd對大訓練集的效果更好,1.因為SGD優化每次疊代使用樣本子集,比使用訓練全集(尤其是百萬數量級)要快得多;2.如果目标函數是凸的或者僞凸的,SGD幾乎必然可以收斂到全局最優;否則,則收斂到局部最優;3.SGD一般不需要收斂到全局最優,隻要得到足夠好的解,就可以立即停止。//@Copper_PKU:sgd的核心思想:是疊代訓練,每拿到一個樣本就算出基于目前w(t) 的loss function,t代表訓練第t次,然後進行下一w(t+1)的更新,w(t+1)=w(t)-(learning rate) * loss function的梯度,這個類比神經網絡中bp中的參數訓練方法。 sample by sample就是每次僅處理一個樣本 而不是一個batch。
- //@Copper_PKU:從損失函數角度說:primal問題可以了解為正則化項+lossfunction,求解目标是在兩個中間取平衡 如果強調loss function最小則會overfitting,是以有C參數。 //@研究者July:SVM還真就是在一定限定條件下,即限制條件下求目标函數的最優值問題,同時,為減少誤判率,盡量讓損失最小。
- ...
非常享受這種全民大讨論的年代,沒有誰一定就對或一定就錯,而是各自發表各自的了解見解,真棒!
參考文獻及推薦閱讀
- 《支援向量機導論》,[美] Nello Cristianini / John Shawe-Taylor 著;
- 支援向量機導論一書的支援網站:http://www.support-vector.net/;
- 《資料挖掘導論》,[美] Pang-Ning Tan / Michael Steinbach / Vipin Kumar 著;
- 《資料挖掘:概念與技術》,(加)Jiawei Han;Micheline Kamber 著;
- 《資料挖掘中的新方法:支援向量機》,鄧乃揚 田英傑 著;
- 《支援向量機--理論、算法和擴充》,鄧乃揚 田英傑 著;
- 支援向量機系列,pluskid:http://blog.pluskid.org/?page_id=683;
- http://www.360doc.com/content/07/0716/23/11966_615252.shtml;
- 資料挖掘十大經典算法初探;
- 《模式識别支援向量機指南》,C.J.C Burges 著;
- 《統計學習方法》,李航著;
- 《統計自然語言處理》,宗成慶編著,第十二章、文本分類;
- SVM入門系列,Jasper:http://www.blogjava.net/zhenandaci/category/31868.html;
- 最近鄰決策和SVM數字識别的實作和比較,作者不詳;
- 斯坦福大學機器學習課程原始講義:http://www.cnblogs.com/jerrylead/archive/2012/05/08/2489725.html;
- 斯坦福機器學習課程筆記:http://www.cnblogs.com/jerrylead/tag/Machine%20Learning/;
- http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html;
- SMO算法的數學推導:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html;
- 資料挖掘掘中所需的機率論與數理統計知識、上;
- 關于機器學習方面的文章,可以讀讀:http://www.cnblogs.com/vivounicorn/category/289453.html;
- 數學系教材推薦:http://blog.sina.com.cn/s/blog_5e638d950100dswh.html;
- 《神經網絡與機器學習(原書第三版)》,[加] Simon Haykin 著;
- 正态分布的前世今生:http://t.cn/zlH3Ygc;
- 《數理統計學簡史》,陳希孺院士著;
- 《最優化理論與算法(第2版)》,陳寶林編著;
- A Gentle Introduction to Support Vector Machines in Biomedicine:http://www.nyuinformatics.org/downloads/supplements/SVM_Tutorial_2010/Final_WB.pdf,此PPT很贊,除了對引入拉格朗日對偶變量後的凸二次規劃問題的深入度不夠之外,其它都挺好,配圖很精彩,本文有幾張圖便引自此PPT中;
- 來自卡内基梅隆大學carnegie mellon university(CMU)的講解SVM的PPT:http://www.autonlab.org/tutorials/svm15.pdf;
- 發明libsvm的台灣林智仁教授06年的機器學習講義SVM:http://wenku.baidu.com/link?url=PWTGMYNb4HGUrUQUZwTH2B4r8pIMgLMiWIK1ymVORrds_11VOkHwp-JWab7IALDiors64JW_6mD93dtuWHwFWxsAk6p0rzchR8Qh5_4jWHC;
- http://staff.ustc.edu.cn/~ketang/PPT/PRLec5.pdf;
- Introduction to Support Vector Machines (SVM),By Debprakash Patnai M.E (SSA),https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCwQFjAA&url=http%3a%2f%2fwww%2epws%2estu%2eedu%2etw%2fccfang%2findex%2efiles%2fAI%2fAI%26ML-Support%2520Vector%2520Machine-1%2eppt&ei=JRR6UqT5C-iyiQfWyIDgCg&usg=AFQjCNGw1fTbpH4ltQjjmx1d25ZqbCN9nA;
- 多人推薦過的libsvm:http://www.csie.ntu.edu.tw/~cjlin/libsvm/;
- 《machine learning in action》,中文版為《機器學習實戰》;
- SMO算法的提出:Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines:http://research.microsoft.com/en-us/um/people/jplatt/smoTR.pdf;
- 《統計學習理論的本質》,[美] Vladimir N. Vapnik著,非常晦澀,不做過多推薦;
- 張兆翔,機器學習第五講之支援向量機http://irip.buaa.edu.cn/~zxzhang/courses/MachineLearning/5.pdf;
- VC維的理論解釋:http://www.svms.org/vc-dimension/,中文VC維解釋http://xiaoxia001.iteye.com/blog/1163338;
- 來自NEC Labs America的Jason Weston關于SVM的講義http://www.cs.columbia.edu/~kathy/cs4701/documents/jason_svm_tutorial.pdf;
- 來自MIT的SVM講義:http://www.mit.edu/~9.520/spring11/slides/class06-svm.pdf;
- PAC問題:http://www.cs.huji.ac.il/~shashua/papers/class11-PAC2.pdf;
- 百度張潼老師的兩篇論文:《Statistical behavior and consistency of classification methods based on convex risk minimization》http://home.olemiss.edu/~xdang/676/Consistency_of_Classification_Convex_Risk_Minimization.pdf,《Statistical analysis of some multi-category large margin classification methods》;
- http://jacoxu.com/?p=39;
- 《矩陣分析與應用》,清華張賢達著;
- SMO算法的實作:http://blog.csdn.net/techq/article/details/6171688;
- 常見面試之機器學習算法思想簡單梳理:http://www.cnblogs.com/tornadomeet/p/3395593.html;
- 矩陣的wikipedia頁面:http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5;
- 最小二乘法及其實作:http://blog.csdn.net/qll125596718/article/details/8248249;
- 統計學習方法概論:http://blog.csdn.net/qll125596718/article/details/8351337;
- http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine;
- A Tutorial on Support Vector Regression:http://alex.smola.org/papers/2003/SmoSch03b.pdf;SVR簡明版:http://www.cmlab.csie.ntu.edu.tw/~cyy/learning/tutorials/SVR.pdf。
- SVM Org:http://www.support-vector-machines.org/;
- R. Collobert. Large Scale Machine Learning. Université Paris VI phd thesis. 2004:http://ronan.collobert.com/pub/matos/2004_phdthesis_lip6.pdf;
- Making Large-Scale SVM Learning Practical:http://www.cs.cornell.edu/people/tj/publications/joachims_99a.pdf;
- 文本分類與SVM:http://blog.csdn.net/zhzhl202/article/details/8197109;
-
Working Set Selection Using Second Order Information
for Training Support Vector Machines:http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf;
- SVM Optimization: Inverse Dependence on Training Set Size:http://icml2008.cs.helsinki.fi/papers/266.pdf;
- Large-Scale Support Vector Machines: Algorithms and Theory:http://cseweb.ucsd.edu/~akmenon/ResearchExam.pdf;
- 凸優化的概念:http://cs229.stanford.edu/section/cs229-cvxopt.pdf;
- 《凸優化》,作者: Stephen Boyd / Lieven Vandenberghe,原作名: Convex Optimization;
- Large-scale Non-linear Classification: Algorithms and Evaluations,Zhuang Wang,講了很多SVM算法的新進展:http://ijcai13.org/files/tutorial_slides/te2.pdf;
- 基于SMO算法實作SVM:http://www.cs.iastate.edu/~honavar/smo-svm.pdf;
- copper推薦的一些SVM相關的論文(當然,其中不少論文在上面的條目中都已經提到):http://c.blog.sina.com.cn/profile.php?blogid=68d0b92d89000h35。