支持向量機通俗導論(理解SVM的三層境界)
作者:July、pluskid ;致謝:白石、JerryLead
出處:結構之法算法之道blog。
前言
第一層、瞭解SVM
1.0、什麼是支持向量機SVM
1.1.、線性分類
1.1.1、分類標準
1.1.2、1或-1分類標準的起源:logistic迴歸
1.1.3、形式化標示類
1.2、線性分類的一個例子
1.3、函數間隔Functional margin與幾何間隔Geometrical margin
1.3.1、函數間隔Functional margin
1.3.2、點到超平面的距離定義:幾何間隔Geometrical margin
1.4、最大間隔分類器Maximum Margin Classifier的定義
1.5、到底什麼是Support Vector
第二層、深入SVM
2.1、從線性可分到線性不可分
2.1.1、從原始問題到對偶問題的求解
2.1.2、線性不可分的情況
2.2、核函數Kernel
2.2.1、如何處理非線性數據
2.2.2、特徵空間的隱式映射:核函數
2.2.3、幾個核函數
2.2.4、核函數的本質
2.3、使用鬆弛變量處理 outliers 方法
2.4、小結
第三層、證明SVM
3.1、線性學習器
3.1.1、感知機算法
3.1.2、鬆弛變量
3.2、最小二乘法
3.3、核函數特徵空間
3.4、SMO算法
3.5、SVM的應用
3.5.1、文本分類
參考文獻及推薦閱讀
前言
動筆寫這個支持向量機(support vector machine)是費了不少勁和困難的,從5月22日凌晨兩點在微博上說我要寫了,到此刻真正動筆要寫此文,中間竟然隔了近半個月(而後你會發現,我寫完此文得花一個半月,修改完善又得再花一個月,故前後加起來至8月底,寫這個SVM便要花足足近3個月)。原因很簡單,一者這個東西本身就並不好懂,要深入學習和研究下去需花費不少時間和精力,二者這個東西也不好講清楚,儘管網上已經有朋友已經寫得不錯了(見文末參考鏈接),但在描述數學公式的時候還是顯得不夠。得益於同學白石的數學證明,我還是想嘗試寫一下,希望本文在兼顧通俗易懂的基礎上,真真正正能足以成爲一篇完整概括和介紹支持向量機的導論性的文章。
本文作爲Top 10 Algorithms in Data Mining系列第二篇文章,將主要結合支持向量機導論、數據挖掘導論及網友Free Mind的支持向量機系列而寫(於此,還是一篇學習筆記,只是加入了自己的理解,有任何不妥之處,還望海涵),宏觀上整體認識支持向量機的概念和用處,微觀上深究部分定理的來龍去脈,證明及原理細節,力求深入淺出 & 通俗易懂。
在本文中,你將看到,理解SVM分三層境界,
- 第一層、瞭解SVM(你只需要對SVM有個大致的瞭解,知道它是個什麼東西便已足夠);
- 第二層、深入SVM(你將跟我一起深入SVM的內部原理,通宵其各處脈絡,以爲將來運用它時遊刃有餘);
- 第三層、證明SVM(當你瞭解了所有的原理之後,你會有大筆一揮,嘗試證明它的衝動);
以此逐層深入,從而照顧到水平深淺度不同的讀者,在保證淺顯直白的基礎上儘可能深入,還讀者一個較爲透徹清晰的SVM。
同時,閱讀本文之前,請讀者注意以下兩點:
- 若讀者用
IE6瀏覽器閱讀本文,將有大部分公式無法正常顯示(顯示一半或者完全無法顯示),故若想正常的閱讀本文請儘量使用chrome等瀏覽器,謝謝大家。 - 本文中出現了諸多公式,若想真正理解本文之內容,我希望讀者,能拿張紙和筆出來,把本文所有定理.公式都親自推導一遍或者直接打印下來,在文稿上演算(讀本blog的最好辦法便是直接把某一篇文章打印下來,隨時隨地思考.演算.討論)。
Ok,還是那句原話,有任何問題,歡迎任何人隨時不吝指正 & 賜教,感謝。
第一層、瞭解SVM
1.0、什麼是支持向量機SVM
要明白什麼是SVM,便得從分類說起。
分類作爲數據挖掘領域中一項非常重要的任務,目前在商業上應用最多(比如分析型CRM裏面的客戶分類模型,客戶流失模型,客戶盈利等等,其本質上都屬於分類問題)。而分類的目的則是學會一個分類函數或分類模型(或者叫做分類器),該模型能吧數據庫中的數據項映射到給定類別中的某一個,從而可以用於預測未知類別。
其實,若叫分類,可能會有人產生誤解,以爲凡是分類就是把一些東西或樣例按照類別給區分開來,實際上,分類方法是一個機器學習的方法,分類也成爲模式識別,或者在概率統計中稱爲判別分析問題。
你甚至可以想當然的認爲,分類就是恰如一個商場進了一批新的貨物,你現在要根據這些貨物的特徵分門別類的擺放在相關的架子上,這一過程便可以理解爲分類,只是它由訓練有素的計算機程序來完成。
來舉個例子,比如心臟病的確診中,如果我要完全確診某人得了心臟病,那麼我必須要進行一些高級的手段,或者藉助一些昂貴的機器,那麼若我們沒有那些高科技醫療機器,怎麼判斷某人是否得了心臟病呢?
當然了,古代中醫是通過望、聞、問、切“四診”,但除了這些,我們在現代醫學裏還是可以利用一些比較容易獲得的臨牀指標進行推斷某人是否得了心臟病。如作爲一個醫生,他可以根據他以往診斷的病例對很多個病人(假設是500個)進行徹底的臨牀檢測之後,已經能夠完全確定了哪些病人具有心臟病,哪些沒有。因爲,在這個診斷的過程中,醫生理所當然的記錄了他們的年齡,膽固醇等10多項病人的相關指標。那麼,以後,醫生可以根據這些臨牀資料,對後來新來的病人通過檢測那10多項年齡、膽固醇等指標,以此就能推斷或者判定病人是否有心臟病(雖說這個做法不能達到100%的標準,但也能達到80、90%的正確率),而這一根據以往臨場病例指標分析來推斷新來的病例的技術,即成爲分類classification技術。
假定是否患有心臟病與病人的年齡和膽固醇水平密切相關,下表對應10個病人的臨牀數據(年齡用[x1]表示,膽固醇水平用[x2]表示):
這樣,問題就變成了一個在二維空間上的分類問題,可以在平面直角座標系中描述如下:根據病人的兩項指標和有無心臟病,把每個病人用一個樣本點來表示,有心臟病者用“+”形點表示,無心臟病者用圓形點,如下圖所示:
如此我們很明顯的看到,是可以在平面上用一條直線把圓點和“+”分開來的。當然,事實上,還有很多線性不可分的情況,下文將會具體描述。
So,本文將要介紹的支持向量機SVM算法便是一種分類方法。
- 所謂支持向量機,顧名思義,分爲兩個部分了解,一什麼是支持向量(簡單來說,就是支持 or 支撐平面上把兩類類別劃分開來的超平面的向量點,下文將具體解釋),二這裏的“機”是什麼意思。我先來回答第二點:這裏的“機(machine,機器)”便是一個算法。在機器學習領域,常把一些算法看做是一個機器,如分類機(當然,也叫做分類器),而支持向量機本身便是一種監督式學習的方法(至於具體什麼是監督學習與非監督學習,請參見此係列Machine L&Data Mining第一篇),它廣泛的應用於統計分類以及迴歸分析中。
支持向量機(SVM)是90年代中期發展起來的基於統計學習理論的一種機器學習方法,通過尋求結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。
對於不想深究SVM原理的同學(比如就只想看看SVM是幹嘛的),那麼,瞭解到這裏便足夠了,不需上層。而對於那些喜歡深入研究一個東西的同學,甚至究其本質的,咱們則還有很長的一段路要走,萬里長征,咱們開始邁第一步吧(相信你能走完)。
1.1、線性分類
OK,在講SVM之前,咱們必須先弄清楚一個概念:線性分類器(也可以叫做感知機,這裏的機表示的還是一種算法,本文第三部分、證明SVM中會詳細闡述)。
1.1.1、分類標準
這裏我們考慮的是一個兩類的分類問題,數據點用
上面給出了線性分類的定義描述,但或許讀者沒有想過:爲何用y取1 或者 -1來表示兩個不同的類別呢?其實,這個1或-1的分類標準起源於logistic迴歸,爲了完整和過渡的自然性,咱們就再來看看這個logistic迴歸。
1.1.2、1或-1分類標準的起源:logistic迴歸
1.1.3、形式化標示
1.2、線性分類的一個例子
下面舉個簡單的例子,一個二維平面(一個超平面,在二維空間中的例子就是一條直線),如下圖所示,平面上有兩種不同的點,分別用兩種不同的顏色表示,一種爲紅顏色的點,另一種則爲藍顏色的點,紅顏色的線表示一個可行的超平面。
從上圖中我們可以看出,這條紅顏色的線把紅顏色的點和藍顏色的點分開來了。而這條紅顏色的線就是我們上面所說的超平面,也就是說,這個所謂的超平面的的確確便把這兩種不同顏色的數據點分隔開來,在超平面一邊的數據點所對應的
接着,我們可以令分類函數(提醒:下文很大篇幅都在討論着這個分類函數):
f(x)=
顯然,如果
(有一朋友飛狗來自Mare_Desiderii,看了上面的定義之後,問道:請教一下SVM functional margin 爲 γˆ=y(wTx+b)=yf(x)中的Y是隻取1和-1 嗎?y的唯一作用就是確保functional margin的非負性?真是這樣的麼?當然不是,詳情請見本文評論下第43樓)
當然,有些時候(或者說大部分時候)數據並不是線性可分的,這個時候滿足這樣條件的超平面就根本不存在(不過關於如何處理這樣的問題我們後面會講),這裏先從最簡單的情形開始推導,就假設數據都是線性可分的,亦即這樣的超平面是存在的。
更進一步,我們在進行分類的時候,將數據點
請讀者注意,下面的篇幅將按下述3點走:
- 咱們就要確定上述分類函數f(x) = w.x + b(w.x表示w與x的內積)中的兩個參數w和b,通俗理解的話w是法向量,b是截距;
- 那如何確定w和b呢?答案是尋找兩條邊界端或極端劃分直線中間的最大間隔(之所以要尋最大間隔是爲了能更好的劃分不同類的點,下文你將看到:爲尋最大間隔,導出1/2||w||^2,繼而引入拉格朗日函數和對偶變量a,化爲對單一因數對偶變量a的求解,當然,這是後話),從而確定最終的最大間隔分類超平面hyper plane和分類函數;
- 進而把尋求分類函數f(x) = w.x + b的問題轉化爲對w,b的最優化問題。
總結成一句話即是:從最大間隔出發(目的本就是爲了確定法向量w),轉化爲求對變量w和b的凸二次規劃問題。亦或如下圖所示(有點需要注意,如讀者@醬爆小八爪所說:從最大分類間隔開始,就一直是凸優化問題):
1.3、函數間隔Functional margin與幾何間隔Geometrical margin
一般而言,一個點距離超平面的遠近可以表示爲分類預測的確信或準確程度。在超平面w*x+b=0確定的情況下,|w*x+b|能夠相對的表示點x到距離超平面的遠近,而w*x+b的符號與類標記y的符號是否一致表示分類是否正確,所以,可以用量y*(w*x+b)的正負性來判定或表示分類的正確性和確信度,於此,我們便引出了函數間隔functional margin的概念。
1.3.1、函數間隔Functional margin
我們定義函數間隔functional margin 爲:
接着,我們定義超平面(w,b)關於訓練數據集T的函數間隔爲超平面(w,b)關於T中所有樣本點(xi,yi)的函數間隔最小值,其中,x是特徵,y是結果標籤,i表示第i個樣本,有:
γˆ=minγˆi (i=1,...n)
然與此同時,問題就出來了。上述定義的函數間隔雖然可以表示分類預測的正確性和確信度,但在選擇分類超平面時,只有函數間隔還遠遠不夠,因爲如果成比例的改變w和b,如將他們改變爲2w和2b,雖然此時超平面沒有改變,但函數間隔的值f(x)卻變成了原來的4倍。其實,我們可以對法向量w加些約束條件,使其表面上看起來規範化,如此,我們很快又將引出真正定義點到超平面的距離--幾何間隔geometrical margin的概念。
1.3.2、點到超平面的距離定義:幾何間隔Geometrical margin
在給出幾何間隔的定義之前,咱們首先來看下,如上圖所示,對於一個點
(||w||表示的是範數,關於範數的概念參見:http://baike.baidu.com/view/637132.htm)
又由於
(有的書上會寫成把||w|| 分開相除的形式,如本文參考文獻及推薦閱讀條目9,其中,||w||爲w的二階泛數)
不過,這裏的
(代人相關式子可以得出:yi*(w/||w|| + b/||w||))
正如本文評論下讀者popol1991留言:函數間隔y*(wx+b)=y*f(x)實際上就是|f(x)|,只是人爲定義的一個間隔度量;而幾何間隔|f(x)|/||w||纔是直觀上的點到超平面距離。
想想二維空間裏的點到直線公式:假設一條直線的方程爲ax+by+c=0,點P的座標是(x0,y0),則點到直線距離爲|ax0+by0+c|/sqrt(a^2+b^2)。如下圖所示:
那麼如果用向量表示,設w=(a,b),f(x)=wx+c,那麼這個距離正是|f(p)|/||w||。
1.4、最大間隔分類器Maximum Margin Classifier的定義
於此,我們已經很明顯的看出,函數間隔functional margin 和 幾何間隔geometrical margin 相差一個
通過上節,我們已經知道:
1、functional margin 明顯是不太適合用來最大化的一個量,因爲在 hyper plane 固定以後,我們可以等比例地縮放
2、而 geometrical margin 則沒有這個問題,因爲除上了
這樣一來,我們的 maximum margin classifier 的目標函數可以定義爲:
當然,還需要滿足一些條件,根據 margin 的定義,我們有
其中
通過求解這個問題,我們就可以找到一個 margin 最大的 classifier ,如下圖所示,中間的紅色線條是 Optimal Hyper Plane ,另外兩條線到紅線的距離都是等於
通過最大化 margin ,我們使得該分類器對數據進行分類時具有了最大的 confidence 。但,這個最大分類間隔器到底是用來幹嘛的呢?很簡單,SVM 通過使用最大分類間隙Maximum Margin Classifier 來設計決策最優分類超平面,而爲何是最大間隔,卻不是最小間隔呢?因爲最大間隔能獲得最大穩定性與區分的確信度,從而得到良好的推廣能力(超平面之間的距離越大,分離器的推廣能力越好,也就是預測精度越高,不過對於訓練數據的誤差不一定是最小的.2012.08.21updated)。
So,對於什麼是Support Vector Machine ,我們可以先這樣理解,如上圖所示,我們可以看到 hyper plane 兩邊的那個 gap 分別對應的兩條平行的線(在高維空間中也應該是兩個 hyper plane)上有一些點,顯然兩個超平面hyper plane 上都會有點存在,否則我們就可以進一步擴大 gap ,也就是增大
1.5、到底什麼是Support Vector
上節,我們介紹了Maximum Margin Classifier,但並沒有具體闡述到底什麼是Support Vector,本節,咱們來重點闡述這個概念。咱們不妨先來回憶一下上節1.4節最後一張圖:
可以看到兩個支撐着中間的 gap 的超平面,它們到中間的純紅線separating hyper plane 的距離相等,即我們所能得到的最大的 geometrical margin
很顯然,由於這些 supporting vector 剛好在邊界上,所以它們是滿足
OK,到此爲止,算是瞭解到了SVM的第一層,對於那些只關心怎麼用SVM的朋友便已足夠,不必再更進一層深究其更深的原理。
第二層、深入SVM
2.1、從線性可分到線性不可分
2.1.1、從原始問題到對偶問題的求解
當然,除了在上文中所介紹的從幾何直觀上之外,支持向量的概念也可以從其優化過程的推導中得到。雖然上文1.4節給出了目標函數,卻沒有講怎麼來求解。現在就讓我們來處理這個問題。回憶一下之前得到的目標函數(subject to導出的則是約束條件):
- 到這個形式以後,就可以很明顯地看出來,它是一個凸優化問題,或者更具體地說,它是一個二次優化問題——目標函數是二次的,約束條件是線性的。這個問題可以用任何現成的 QP (Quadratic Programming) 的優化包進行求解;
- 雖然這個問題確實是一個標準的 QP 問題,但是它也有它的特殊結構,通過 Lagrange Duality 變換到對偶變量 (dual variable) 的優化問題之後,可以找到一種更加有效的方法來進行求解,而且通常情況下這種方法比直接使用通用的 QP 優化包進行優化要高效得多。
也就說,除了用解決QP問題的常規方法之外,還可以應用拉格朗日對偶性,通過求解對偶問題得到最優解,這就是線性可分條件下支持向量機的對偶算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。
ok,接下來,你將看到“對偶變量dual variable的優化問題”等類似的關鍵詞頻繁出現,便是解決此凸優化問題的第二種更爲高效的解--對偶變量的優化求解。
至於上述提到,關於什麼是Lagrange duality?簡單地來說,通過給每一個約束條件加上一個 Lagrange multiplier(拉格朗日乘值),即引入拉格朗日對偶變量α,如此我們便可以通過拉格朗日函數將約束條件融和到目標函數裏去(也就是說把條件融合到一個函數裏頭,現在只用一個函數表達式便能清楚的表達出我們的問題):
然後我們令
容易驗證,當某個約束條件不滿足時,例如
這裏用
當然,交換以後的問題不再等價於原問題,這個新問題的最優值用
注:上段說“在滿足某些條件的情況下”,這所謂的“滿足某些條件”就是要先滿足Slater's Condition,進而就滿足KKT條件。理由如下3點所述(觀點來自frestyle):
- 在convex problem中,d*和p*相同的條件是Slater's Condition,Slater's condition保證臨界點saddle point存在。
- 至於KKT條件,首先原問題的最優值可以通過求Lagrangian的臨界點saddle point(如果有的話)來得到,再者,KKT theorem裏面進一步引入了更強的前提,也就是在滿足Slater condition的同時(前面說了,Slater's condition保證臨界點saddle point存在),f和gi都是可微的,這樣saddle point不僅存在,而且能通過對Lagrangian求導得到,
- 所以KKT條件是一個點是最優解的條件,而不是d*=p*的條件,當然這個KKT條件對後邊簡化dual problem很關鍵。
那KKT條件的表現形式是什麼呢?據維基百科:KKT 條件的介紹,一般地,一個最優化數學模型能夠表示成下列標準形式:
所謂 Karush-Kuhn-Tucker 最優化條件,就是指上式的最小點 x* 必須滿足下面的條件:
經過論證,我們這裏的問題是滿足 KKT 條件的(首先已經滿足Slater
condition,再者f和gi也都是可微的,即L對w和b都可導),因此現在我們便轉化爲求解第二個問題。也就是說,現在,咱們的原問題通過滿足一定的條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分爲3個步驟,首先要讓L(w,b,a) 關於
(1)、首先固定α,要讓 ,貌似博客系統故障,原來評論在第45樓的回覆現在第45+81樓,即第126樓顯示):
帶回上述的
提醒:有讀者可能會問上述推導過程如何而來?說實話,其具體推導過程是比較複雜的,如下圖所示:
最後,得到:
如 jerrylead所說:“倒數第4步”推導到“倒數第3步”使用了線性代數的轉置運算,由於ai和yi都是實數,因此轉置後與自身一樣。“倒數第3步”推導到“倒數第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法運算法則。最後一步是上一步的順序調整。
從上面的最後一個式子,我們可以看出,此時的拉格朗日函數只包含了一個變量,那就是ai,然後下文的第2步,求出了ai便能求出w,和b,由此可見,上文第1.2節提出來的核心問題:分類函數w^T + b 也就可以輕而易舉的求出來了。
由此看出,使用拉格朗日定理解凸最優化問題可以使用一個對偶變量表示,轉換爲對偶問題後,通常比原問題更容易處理,因爲直接處理不等式約束是困難的,而對偶問題通過引入拉格朗日乘子(又稱爲對偶變量)來解。
(2)、求對α的極大,即是關於對偶變量dual
variable
(不得不提醒下讀者:經過上面第一個步驟的求w和b,得到的拉格朗日函數式子已經沒有了變量w,b,只有a,而反過來,求得的a將能導出w,b的解,最終得出分離超平面和分類決策函數。爲何呢?因爲如果求出了ai,根據,即可求出w。然後通過,即可求出b )
如前面所說,這個問題有更加高效的優化算法,即我們常說的SMO算法。
(3)、序列最小最優化SMO算法。細心的讀者讀至上節末尾處,怎麼求對偶變量α的值可能依然心存疑惑。實際上,關於a的求解過程即是我們常說的SMO算法,這裏簡要簡單介紹下。
OK,當:
- 第一步選取一對和,選取方法使用啓發式方法;
- 第二步,固定除和之外的其他參數,確定W極值條件下的,由表示。
2.1.2、線性不可分的情況
OK,爲過渡到下節2.2節所介紹的核函數,讓我們再來看看上述推導過程中得到的一些有趣的形式。首先就是關於我們的 hyper plane ,對於一個數據點
w=∑ni=1αiyixi
因此分類函數爲:
這裏的形式的有趣之處在於,對於新點 x的預測,只需要計算它與訓練數據點的內積即可(⋅,⋅表示向量內積),這一點至關重要,是之後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這裏顯示出來——事實上,所有非 Supporting Vector 所對應的係數 α 都是等於零的,因此對於新點的內積計算實際上只要針對少量的“支持向量”而不是所有的訓練數據即可。
爲什麼非支持向量對應的
回憶一下我們2.1.1節中通過 Lagrange multiplier得到的目標函數:
注意到如果
從1.5節到上述所有這些東西,便得到了一個maximum margin hyper plane classifier,這就是所謂的支持向量機(Support Vector Machine)。當然,到目前爲止,我們的 SVM 還比較弱,只能處理線性的情況,不過,在得到了對偶dual 形式之後,通過 Kernel 推廣到非線性的情況就變成了一件非常容易的事情了(相信,你還記得本節開頭所說的:通過求解對偶問題得到最優解,這就是線性可分條件下支持向量機的對偶算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題)。
2.2、核函數Kernel
咱們首先給出核函數的來頭:
- 在上文中,我們已經瞭解到了SVM處理線性可分的情況,而對於非線性的情況,SVM 的處理方法是選擇一個核函數
κ(⋅,⋅) ,通過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。由於核函數的優良品質,這樣的非線性擴展在計算量上並沒有比原來複雜多少,這一點是非常難得的。當然,這要歸功於核方法——除了 SVM 之外,任何將計算表示爲數據點的內積的方法,都可以使用核方法進行非線性擴展。
也就是說,Minsky和Papert早就在20世紀60年代就已經明確指出線性學習器計算能力有限。爲什麼呢?因爲總體上來講,現實世界複雜的應用需要有比線性函數更富有表達能力的假設空間,也就是說,目標概念通常不能由給定屬性的簡單線性函數組合產生,而是應該一般地尋找待研究數據的更爲一般化的抽象特徵。
而下文我們將具體介紹的核函數則提供了此種問題的解決途徑,從下文你將看到,核函數通過把數據映射到高維空間來增加第一節所述的線性學習器的能力,使得線性學習器對偶空間的表達方式讓分類操作更具靈活性和可操作性。我們知道,訓練樣例一般是不會獨立出現的,它們總是以成對樣例的內積形式出現,而用對偶形式表示學習器的優勢在爲在該表示中可調參數的個數不依賴輸入屬性的個數,通過使用恰當的核函數來替代內積,可以隱式得將非線性的訓練數據映射到高維空間,而不增加可調參數的個數(當然,前提是核函數能夠計算對應着兩個輸入特徵向量的內積)。
- 首先使用一個非線性映射將數據變換到一個特徵空間F,
- 然後在特徵空間使用線性學習器分類。
2.2.1、如何處理非線性數據
在2.1節中我們介紹了線性情況下的支持向量機,它通過尋找一個線性的超平面來達到對數據進行分類的目的。不過,由於是線性方法,所以對非線性的數據就沒有辦法處理了。舉個例子來說,則是如下圖所示的兩類數據,分別分佈爲兩個圓圈的形狀,這樣的數據本身就是線性不可分的,你準備如何把這兩類數據分開呢(下文將會有一個相應的三維空間圖)?
上圖所述的這個數據集,就是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,所以,一個理想的分界應該是一個“圓圈”而不是一條線(超平面)。如果用
注意上面的形式,如果我們構造另外一個五維的空間,其中五個座標的值分別爲
關於新的座標
2.2.2、特徵空間的隱式映射:核函數
再進一步描述 Kernel 的細節之前,不妨再來看看這個例子映射過後的直觀例子。當然,你我可能無法把 5 維空間畫出來,不過由於我這裏生成數據的時候就是用了特殊的情形,具體來說,我這裏的超平面實際的方程是這個樣子(圓心在
因此我只需要把它映射到
現在讓我們再回到 SVM 的情形,假設原始的數據時非線性的,我們通過一個映射
現在則是在映射過後的空間,即:
而其中的
這樣一來問題就解決了嗎?似乎是的:拿到非線性數據,就找一個映射
不妨還是從最開始的簡單例子出發,設兩個向量和,而即是到前面2.2.1節說的五維空間的映射,因此映射過後的內積爲:
(公式說明:上面的這兩個推導過程中,所說的前面的五維空間的映射,這裏說的前面便是文中2.2.1節的所述的映射方式,仔細看下2.2.1節的映射規則,再看那第一個推導,其實就是計算x1,x2各自的內積,然後相乘相加即可,第二個推導則是直接平方,去掉括號,也很容易推出來)
另外,我們又注意到:
二者有很多相似的地方,實際上,我們只要把某幾個維度線性縮放一下,然後再加上一個常數維度,具體來說,上面這個式子的計算結果實際上和映射
之後的內積的結果是相等的,那麼區別在於什麼地方呢?
- 一個是映射到高維空間中,然後再根據內積的公式進行計算;
- 而另一個則直接在原來的低維空間中進行計算,而不需要顯式地寫出映射後的結果。
(公式說明:上面之中,最後的兩個式子,第一個算式,是帶內積的完全平方式,可以拆開,然後,通過湊一個得到,第二個算式,也是根據第一個算式湊出來的)
回憶剛纔提到的映射的維度爆炸,在前一種方法已經無法計算的情況下,後一種方法卻依舊能從容處理,甚至是無窮維度的情況也沒有問題。
我們把這裏的計算兩個向量在隱式映射過後的空間中的內積的函數叫做核函數 (Kernel Function) ,例如,在剛纔的例子中,我們的核函數爲:
核函數能簡化映射空間中的內積運算——剛好“碰巧”的是,在我們的 SVM 裏需要計算的地方數據向量總是以內積的形式出現的。對比剛纔我們上面寫出來的式子,現在我們的分類函數爲:
其中
這樣一來計算的問題就算解決了,避開了直接在高維空間中進行計算,而結果卻是等價的!當然,因爲我們這裏的例子非常簡單,所以我可以手工構造出對應於的核函數出來,如果對於任意一個映射,想要構造出對應的核函數就很困難了。
最理想的情況下,我們希望知道數據的具體形狀和分佈,從而得到一個剛好可以將數據映射成線性可分的,然後通過這個得出對應的進行內積計算。然而,第二步通常是非常困難甚至完全沒法做的。不過,由於第一步也是幾乎無法做到,因爲對於任意的數據分析其形狀找到合適的映射本身就不是什麼容易的事情,所以,人們通常都是“胡亂”選擇映射的,所以,根本沒有必要精確地找出對應於映射的那個核函數,而只需要“胡亂”選擇一個核函數即可——我們知道它對應了某個映射,雖然我們不知道這個映射具體是什麼。由於我們的計算只需要核函數即可,所以我們也並不關心也沒有必要求出所對應的映射的具體形式。
當然,也並不是任意的二元函數都可以作爲核函數,所以除非某些特殊的應用中可能會構造一些特殊的核(例如用於文本分析的文本核,注意其實使用了 Kernel 進行計算之後,其實完全可以去掉原始空間是一個向量空間的假設了,只要核函數支持,原始數據可以是任意的“對象”——比如文本字符串),通常人們會從一些常用的核函數中選擇(根據問題和數據的不同,選擇不同的參數,實際上就是得到了不同的核函數),例如:
- 多項式核,顯然剛纔我們舉的例子是這裏多項式核的一個特例(R = 1,d = 2)。雖然比較麻煩,而且沒有必要,不過這個核所對應的映射實際上是可以寫出來的,該空間的維度是,其中
是原始空間的維度。 - 高斯核,這個核就是最開始提到過的會將原始空間映射爲無窮維空間的那個傢伙。不過,如果選得很大的話,高次特徵上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果選得很小,則可以將任意的數據映射爲線性可分——當然,這並不一定是好事,因爲隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數,高斯覈實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。下圖所示的例子便是把低維線性不可分的數據通過高斯核函數映射到了高維空間:
- 線性核,這實際上就是原始空間中的內積。這個核存在的主要目的是使得“映射後空間中的問題”和“映射前空間中的問題”兩者在形式上統一起來了(意思是說,咱們有的時候,寫代碼,或寫公式的時候,只要寫個模板或通用表達式,然後再代入不同的核,便可以了,於此,便在形式上統一了起來,不用再分別寫一個線性的,和一個非線性的)。
2.2.4、核函數的本質
- 實際中,我們會經常遇到線性不可分的樣例,此時,我們的常用做法是把樣例特徵映射到高維空間中去(如上文2.2節最開始的那幅圖所示,映射到高維空間後,相關特徵便被分開了,也就達到了分類的目的);
- 但進一步,如果凡是遇到線性不可分的樣例,一律映射到高維空間,那麼這個維度大小是會高到可怕的(如上文中19維乃至無窮維的例子)。那咋辦呢?
- 此時,核函數就隆重登場了,核函數的價值在於它雖然也是講特徵進行從低維到高維的轉換,但核函數絕就絕在它事先在低維上進行計算,而將實質上的分類效果表現在了高維上,也就如上文所說的避免了直接在高維空間中的複雜計算。
第二步、對α求極大如下所示:
2.3、使用鬆弛變量處理 outliers 方法
在本文第一節最開始討論支持向量機的時候,我們就假定,數據是線性可分的,亦即我們可以找到一個可行的超平面將數據完全分開。後來爲了處理非線性數據,在上文2.2節使用 Kernel 方法對原來的線性 SVM 進行了推廣,使得非線性的的情況也能處理。雖然通過映射
用黑圈圈起來的那個藍點是一個 outlier ,它偏離了自己原本所應該在的那個半空間,如果直接忽略掉它的話,原來的分隔超平面還是挺好的,但是由於這個 outlier 的出現,導致分隔超平面不得不被擠歪了,變成途中黑色虛線所示(這只是一個示意圖,並沒有嚴格計算精確座標),同時 margin 也相應變小了。當然,更嚴重的情況是,如果這個 outlier 再往右上移動一些距離的話,我們將無法構造出能將數據分開的超平面來。
爲了處理這種情況,SVM 允許數據點在一定程度上偏離一下超平面。例如上圖中,黑色實線所對應的距離,就是該 outlier 偏離的距離,如果把它移動回來,就剛好落在原來的超平面上,而不會使得超平面發生變形了。具體來說,原來的約束條件
現在變成
其中稱爲鬆弛變量 (slack variable) ,對應數據點允許偏離的 functional margin 的量。當然,如果我們運行任意大的話,那任意的超平面都是符合條件的了。所以,我們在原來的目標函數後面加上一項,使得這些的總和也要最小:
其中
分析方法和前面一樣,轉換爲另一個問題之後,我們先讓針對、
將
不過,由於我們得到而又有(作爲 Lagrange multiplier 的條件),因此有,所以整個 dual 問題現在寫作:
把前後的結果對比一下:
可以看到唯一的區別就是現在 dual variable 多了一個上限
2.4、小結
綜上所述,對於一個線性可分的兩類問題,我們可以通過g(x)=w^T*x+w0=0確定一個分類面把這兩類分開。我們的目的是爲了建立一個這樣的分類面,事實上這樣的分類面不是唯一確定的。在感知器裏我們通過梯度下降法優化出一個分類器初始值的選擇、迭代步長等的不同得到的分類器也不同。那麼我們需要在這些分離器裏找一個最好的。
如圖所示,我們可以認爲direction2的分類效果要比 direction1的分類效果要好,因爲direction2的裕量比direction1大。我們需要在這各個分類器中選擇一個最優的。SVM是根據統計學習理論依照結構風險最小化的原則提出的,要求實現兩個目的:1)兩類問題能夠分開(經驗風險最小)2)margin最大化(風險上界最小)既是在保證風險最小的子集中選擇經驗風險最小的函數。
把樣本到分類面的距離
進行歸一化處理後我們得到裏分類面最近的樣本g(x) = 1。
這樣我們就有邊界margin:,這裏滿足這樣條件的樣本點就是我們所謂的支持向量。
這樣我們就轉化爲一個優化問題Sergios Theodoridis:
建立拉格朗日方程並引入KKT條件得到:
由上式得到判別函數式:
對於不是線性可分的問題,我們可以通過加入鬆弛子C來解決:
由以上討論我們得到判別函數只與向量的內積有關,因此我們可以選擇一個非線性變換將x映射到高維空間,在低維空間不可分的問題映射到高維空間後就有可能是線性可分的。這裏我們不需要知道是什麼形式的只需要關注內積運算即可。由此,可以通過構造核函數實現:
這裏的核函數的選擇沒有特別的方式,在Chih-Wei Hsu中推薦使用徑向基函數。
故不準確的說,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個東西,感知機算法,鬆弛變量,及最小二乘理論,同時,基本上是貼的用相機拍的照片(爲什麼?懶);
- 3.2節、核函數特徵空間;
- 3.3節、SMO算法;
- 3.4節、簡略談談SVM的應用。
3.1、線性學習器
3.1.1、感知機算法
3.1.2、鬆弛變量
針對上面左圖的說明:我們知道,當分類出現了誤差,要麼就是被誤分,要麼就是沒有以正常的間隔被分開:
- 被誤分。如上面左圖所示,如果一切正常的話,那麼xi出現的位置不該是那裏,而是該左圖中左邊那個箭頭所示,被“拉回去”,而既然出現在了這個不正常的位置,那麼有什麼後果內,這就導致了所謂的被誤分,使得最終的鬆弛變量>0;同理,oj也不該出現在那個位置,而應該被“拉回去”。
- 沒有以正常的間隔被分開。還是如上面所示左圖,xk顯然沒有被以正常的間隔分開,而是過於靠近超平面。
當然,還需要滿足一些條件,根據 margin 的定義,我們有
3.2、最小二乘法
既然本節開始之前提到了最小二乘法,那麼下面稍微簡單闡述下。
我們口頭中經常說:一般來說,平均來說。如平均來說,不吸菸的健康優於吸菸者,之所以要加“平均”二字,是因爲凡事皆有例外,總存在某個特別的人他吸菸但由於經常鍛鍊所以他的健康狀況可能會優於他身邊不吸菸的朋友。而最小二乘法的一個最簡單的例子便是算術平均。
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和爲最小。用函數表示爲:
使誤差「所謂誤差,當然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作爲目標函數只是衆多可取的方法之一。
最小二乘法的一般形式可表示爲:
有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認爲測量中有誤差,所以所有方程的累積誤差爲
我們求解出導致累積誤差最小的參數即可。
勒讓德在論文中對最小二乘法的優良性做了幾點說明:
- 最小二乘使得誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某一個極端誤差取得支配地位
- 計算中只要求偏導後求解線性方程組,計算過程明確便捷
- 最小二乘可以導出算術平均值作爲估計值
對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值爲
求解
由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信心。
最小二乘法發表之後很快得到了大家的認可接受,並迅速的在數據分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,並且聲稱自己已經使用這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。
OK,更多請參看陳希孺院士的「數理統計學簡史」的第4章、最小二乘法。
3.3、核函數特徵空間
經過前面第一、二部分,我們已經知道,當把內積就變成之後,求將有兩種方法:
1、先找到這種映射,然後將輸入空間中的樣本映射到新的空間中,最後在新空間中去求內積。以多項式 爲例,對其進行變換,,,,,得到:,也就是說通過把輸入空間從二維向四維映射後,樣本由線性不可分變成了線性可分,但是這種轉化帶來的直接問題是維度變高了,這意味着,首先可能導致後續計算變複雜,其次可能出現維度之咒,對於學習器而言就是:特徵空間維數可能最終無法計算,而它的泛化能力(學習器對訓練樣本以外數據的適應性)會隨着維度的增長而大大降低,這也違反了“奧坎姆的剃刀”,最終可能會使得內積無法求出,於是也就失去了這種轉化的優勢了;
2、或者是找到某種方法,它不需要顯式的將輸入空間中的樣本映射到新的空間中而能夠在輸入空間中直接計算出內積。它其實是對輸入空間向高維空間的一種隱式映射,它不需要顯式的給出那個映射,在輸入空間就可以計算,這就是傳說中的核函數方法。
OK,不再做過多介紹了,對核函數有進一步興趣的,還可以看看此文:http://www.cnblogs.com/vivounicorn/archive/2010/12/13/1904720.html。3.4、SMO算法
SMO算法是<<Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》一文中提出的,作者信息:http://research.microsoft.com/en-us/people/jplatt/,其基本思想是將Vapnik在1982年提出的Chunking方法推到極致,即:通過將原問題分解爲一系列小規模凸二次規劃問題而獲得原問題解的方法,每次迭代只優化由2個點組成的工作集,SMO算法每次啓發式地選擇兩個因子同時固定其它因子來找到這兩個因子的最優值,直到達到停止條件。
上文2.1.1節已經提到過,SMO算法不過是爲了解決對偶問題中對偶因子α的求解問題,這兩篇文章:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html,http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html,已經介紹的相當詳盡,包括算法思想及其實現,此處不再贅述。
3.5、SVM的應用
或許我們已經聽到過,SVM在很多諸如文本分類,圖像分類,生物序列分析和生物數據挖掘,手寫字符識別等領域有很多的應用,但或許你並沒強烈的意識到,SVM可以成功應用的領域遠遠超出現在已經在開發應用了的領域。
3.5.1、文本分類
一個文本分類系統不僅是一個自然語言處理系統,也是一個典型的模式識別系統,系統的輸入是需要進行分類處理的文本,系統的輸出則是與文本關聯的類別。由於篇幅所限,其它更具體內容本文將不再詳述。
OK,本節雖取標題爲證明SVM,但聰明的讀者們想必早已看出,其實本部分並無多少證明部分(特此致歉),怎麼辦呢?可以參閱支持向量機導論一書,此書精簡而有趣。
最後,非常感謝pluskid及諸多朋友&牛人們的文章及著作,讓我有機會在其基礎上總結、深入,本文基本成型。謝謝。
參考文獻及推薦閱讀
- 《支持向量機導論》,[美] 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 著;
- 《統計學習方法》,李航著(第7章有不少內容參考自支持向量機導論一書,不過,可以翻翻看看);
- 《統計自然語言處理》,宗成慶編著,第十二章、文本分類;
- 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;
- 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中;
- 來自卡梅隆大學的講解SVM的PPT:http://www.autonlab.org/tutorials/svm15.pdf;