對SVM的個人理解---淺顯易懂


原文:http://blog.csdn.net/arthur503/article/details/19966891

之前以為SVM很強大很神秘,自己了解了之后發現原理並不難,不過,“大師的功力在於將idea使用數學定義它,使用物理描述它”,這一點在看SVM的數學部分的時候已經深刻的體會到了,最小二乘法、梯度下降法、拉格朗日乘子、對偶問題等等被搞的焦頭爛額。在培樂園聽了講課之后才算比較清晰的了解了整個數學推導的來龍去脈。

1. 為什么一定要研究線性分類?

首先說一下為什么對數據集一定要說線性可分或線性不可分,難道不可以非線性分開嗎?想要非線性分開當然可以,實際上SVM只是把原來線性不可分的數據點映射到一個新的空間,轉換為在新空間中線性可分數據來進行分類的。如果返回到原來數據的空間中,其實還是非線性分開的。但是,那為什么不直接在原數據空間中進行非線性分開,而是非要轉到新的空間進行線性分開呢?首先,非線性分開比線性分開要復雜很多。線性分開只要一條直線或一個平面之類的就可以了,可以說是曲線中最簡單的表現形式。而非線性分開的情況就多了去了。僅就二維空間而言,曲線、折線、雙曲線、圓錐曲線、波浪線,以及毫無規律的各種其他曲線太多,沒有辦法進行統一的處理。即便能夠針對某一個具體問題處理得到了非線性分類結果,也無法很好的推廣到其他情形,這樣,每針對一個具體問題就要數學家專門來建個曲線模型,太麻煩而且也沒有那么多時間精力。因此,采用線性分類一是因為它簡單,性質很容易研究透徹;二是因為它推廣能力強,研究透了之后,其他所有問題都迎刃而解,無需建立其他模型。所以,雖然SVM多了將原始數據映射到新空間這一步驟,看起來增加了工作量,而且如何去尋找新的映射空間看着也不是很容易,但是,總體來說,研究透了之后就會比其他方法省很多力氣。

2. SVM的思想是什么?

2.1 硬間隔支持向量機

SVM中最關鍵的思想之一就是引入和定義了“間隔”這個概念。這個概念本身很簡單,以二維空間為例,就是點到分類直線之間的距離。假設直線為y=wx+b,那么只要使所有正分類點到該直線的距離與所有負分類點到該直線的距離的總和達到最大,這條直線就是最優分類直線。這樣,原問題就轉化為一個約束優化問題,可以直接求解。這叫做硬間隔最大化,得到的SVM模型稱作硬間隔支持向量機

 

2.2 軟間隔支持向量機

 

但是新問題出現了,在實際應用中,我們得到的數據並不總是完美的線性可分的,其中可能會有個別噪聲點,他們錯誤的被分類到了其他類中。如果將這些特異的噪點去除后,可以很容易的線性可分。但是,我們對於數據集中哪些是噪聲點卻是不知道的,如果以之前的方法進行求解,會無法進行線性分開。是不是就沒辦法了呢?假設在y=x+1直線上下分為兩類,若兩類中各有對方的幾個噪點,在人的眼中,仍然是可以將兩類分開的。這是因為在人腦中是可以容忍一定的誤差的,仍然使用y=x+1直線分類,可以在最小誤差的情況下進行最優的分類。同樣的道理,我們在SVM中引入誤差的概念,將其稱作“松弛變量”。通過加入松弛變量,在原距離函數中需要加入新的松弛變量帶來的誤差,這樣,最終的優化目標函數變成了兩個部分組成:距離函數和松弛變量誤差。這兩個部分的重要程度並不是相等的,而是需要依據具體問題而定的,因此,我們加入權重參數C,將其與目標函數中的松弛變量誤差相乘,這樣,就可以通過調整C來對二者的系數進行調和。如果我們能夠容忍噪聲,那就把C調小,讓他的權重降下來,從而變得不重要;反之,我們需要很嚴格的噪聲小的模型,則將C調大一點,權重提升上去,變得更加重要。通過對參數C的調整,可以對模型進行控制。這叫做軟間隔最大化,得到的SVM稱作軟間隔支持向量機

 

2.3 非線性支持向量機

 

之前的硬間隔支持向量機和軟間隔支持向量機都是解決線性可分數據集或近似線性可分數據集的問題的。但是如果噪點很多,甚至會造成數據變成了線性不可分的,那該怎么辦?最常見的例子是在二維平面笛卡爾坐標系下,以原點(0,0)為圓心,以1為半徑畫圓,則圓內的點和圓外的點在二維空間中是肯定無法線性分開的。但是,學過初中幾何就知道,對於圓圈內(含圓圈)的點:x^2+y^2≤1,圓圈外的則x^2+y^2>1。我們假設第三個維度:z=x^2+y^2,那么在第三維空間中,可以通過z是否大於1來判斷該點是否在圓內還是圓外。這樣,在二維空間中線性不可分的數據在第三維空間很容易的線性可分了。這就是非線性支持向量機

這是SVM非常重要的思想。對於在N維空間中線性不可分的數據,在N+1維以上的空間會有更大到可能變成線性可分的(但並不是一定會在N+1維上線性可分。維度越高,線性可分的可能性越大,但並不完全確保)。因此,對於線性不可分的數據,我們可以將它映射到線性可分的新空間中,之后就可以用剛才說過的硬間隔支持向量機或軟間隔支持向量機來進行求解了。這樣,我們將原問題變成了如何對原始數據進行映射,才能使其在新空間中線性可分。在上面的例子中,通過觀察可以使用圓的方程來進行映射,但在實際數據中肯定沒有這么簡單。如果都可以觀察出規律來,那就不需要機器來做SVM了。。

實際中,對某個實際問題函數來尋找一個合適的空間進行映射是非常困難的,幸運的是,在計算中發現,我們需要的只是兩個向量在新的映射空間中的內積結果,而映射函數到底是怎么樣的其實並不需要知道。這一點不太好理解,有人會問,既然不知道映射函數,那怎么能知道映射后在新空間中的內積結果呢?答案其實是可以的。這就需要引入了核函數的概念。核函數是這樣的一種函數:仍然以二維空間為例,假設對於變量x和y,將其映射到新空間的映射函數為φ,則在新空間中,二者分別對應φ(x)和φ(y),他們的內積則為<φ(x),φ(y)>。我們令函數Kernel(x,y)=<φ(x),φ(y)>=k(x,y),可以看出,函數Kernel(x,y)是一個關於x和y的函數!而與φ無關!這是一個多么好的性質!我們再也不用管φ具體是什么映射關系了,只需要最后計算Kernel(x,y)就可以得到他們在高維空間中的內積,這樣就可以直接帶入之前的支持向量機中計算!真是媽媽再也不用擔心我的學習了。。

得到這個令人歡欣鼓舞的函數之后,我們還需要冷靜一下,問問:這個Kernel函數從哪來?他又是怎么得到的?真的可以解決所有映射到高維空間的問題嗎?

這個問題我試着回答一下,如果我理解對的話。核函數不是很好找到,一般是由數學家反向推導出來或拼湊出來的。現在知道的有多項式核函數、高斯核函數、字符串核函數等。其中,高斯核函數對應的支持向量機是高斯徑向基函數(RBF),是最常用的核函數。

RBF核函數可以將維度擴展到無窮維的空間,因此,理論上講可以滿足一切映射的需求。為什么會是無窮維呢?我以前都不太明白這一點。后來老師講到,RBF對應的是泰勒級數展開,在泰勒級數中,一個函數可以分解為無窮多個項的加和,其中,每一個項可以看做是對應的一個維度,這樣,原函數就可以看做是映射到了無窮維的空間中。這樣,在實際應用中,RBF是相對最好的一個選擇。當然,如果有研究的話,還可以選用其他核函數,可能會在某些問題上表現更好。但是,RBF是在對問題不了解的情況下,對最廣泛問題效果都很不錯的核函數。因此,使用范圍也最廣。

這樣,對於線性不可分的數據,也可以通過RBF等核函數來映射到高維,甚至無窮維的空間中而變得線性可分,通過計算間隔和松弛變量等的最大化,可以對問題進行求解。當然,在求解中,還有一些數學的技巧來簡化運算,例如,使用拉格朗日乘子來將原問題變換為對偶問題,可以簡化計算。這些在實驗中用不到,而且數學原理有點困難,就先不講了。

 

==========

原文:http://blog.csdn.net/viewcode/article/details/12840405

SVM的文章介紹多如牛毛,很多介紹都非常詳盡,而我卻一點都不開竅,始終無法理解其中的奧秘。

這次,我要用自己粗淺的語言,來撩開我與SVM之間的面紗。

 

1. SVM是要解決什么問題?

之前,沖上來就看SVM的應用,簡介,最優化計算方法等。從沒認真想過SVM要解決什么問題。
 
下面一幅是常用的圖,來解釋SVM的需求。
 
SVM最基本的應用是分類。 求解最優的分類面,然后用於分類。
 
最優分類面的定義: 
對於SVM,存在一個分類面,兩個點集到此平面的最小距離最大,兩個點集中的邊緣點到此平面的距離最大。
 
從直觀上來看,下圖左邊的,肯定不是最優分類面;而右邊的能讓人感覺到其距離更大,使用的支撐點更多,至少使用了三個分類面,應該是最優分類面。
 
那么,是不是一個最優分類面需要兩個或三個以上的點才能確定那?
這個要依據實際情況而定。
 
如下圖,左圖是由三個點,來確定的一個最優分類面,不同類別的兩個點確定一個中心點,而同類的兩個點可以確定方向向量。這個最優分類面,需要三個點。
但對於右圖,直接獲取不同類別的兩個點的垂面,即是最優分類面。這個分類面,則需要兩個點。
以上,情況的分析,使得求解最優分類面的思路,模式比較復雜。
若采用窮舉法,至少需要以下過程。
先取不同類別的兩個點,求解中心連線的垂面。如以上右圖模式
然后判斷其他點到此垂面的距離,若有更小的距離(或負值,即分類錯誤),則選取以上左圖模式。
 
窮舉所有點。采用最直接的方式處理,則其運算復雜度為 m*n*n, 若n > m.
 
這個還沒有用到高維映射哪,如果再加上高維映射的處理,算法恐怕就更復雜了。所以,窮舉法是不太現實的。
 

2. 從直觀到數學推論

由直觀到擬合:
 
直觀上,存在一個最優的超平面。
那么,我們就假設這個最優面的公式是:
 
W * X + b = 0,
 
那么對於所有的點集x,
都存在平行於最優超平面,的點集的邊界面
W * xi + b >= 1 或 W * xi + b <= -1, 這里 yi可以歸一化為1,-1
 
最大化這兩個平行超平面的距離。即
max  2 / ||w||
 
或者說是 最小化w,即 min ||w||
 
另外一個條件是 W * xi + b >= 1 或 W * xi + b <= -1。
 
這個有點超出平時用的計算方法了(如果沒學過最優化理論),因既有求極值,又有不等式存在。這個是典型的QP(quandratic programming)二次規划問題。
高數里面有有關求極值的理論,采用的是拉格朗日乘子法,但其條件是等式。
 
所以,需要將不等式,轉化為等式的形式。 方法就引入變量。
給每個點配上一個系數α,若是邊界點,那么α就為大於0,否則就為0.
則 αi * yi * (W * xi + b) = 0.
 
從另一方面來講,αi也可以看做是拉格朗日系數,采用拉格朗日乘子法,求極值。
由於αi也是未知的。所以,又需要求出αi。
 
 

即 min ( max L ), max L 是因為后面的超平面公式經過減號后變成了 <= 形式,其求和的最大值為0。

先對min求極值, 對w,和b進行微分。
 
推導出以下關系
 
(blog沒公式編輯器,想偷懶只要剪貼了)
 
終於推出簡單點的公式了。由min 到 max 也是一個對偶轉換的過程,又稱dual
 
求max極值,並且,只有一個等式約束條件,缺點就是未知變量也增加了。
 
接下來,就是用最優化的方法,求取極值了。
 
對未知變量,取一個初始值,然后用點集中的點,一個接一個的進行訓練。
直至未知變量收斂。
 
3. SMO 解法
SVM 從簡單邊界分類思路,到復雜的拉格朗日求解。
 
其實,對於二次規划問題,有經典的最速下降法,牛頓法等最優化求解方法。而SMO是一個SVM的優化算法,避開了經典的二次規划問題。
 
消除w,轉換為 αi 的求解。這是一個更加有效的求解方法
 
利用KKT條件,再加上一堆的推論,終於有以下公式:
 
還是這么多公式和術語,真是令我頭疼。只能先記着,后面慢慢消化。
 
原理理解:
 αi *  αj  * ... 其實仍然是一個多元規划問題,所以,先多做幾個假設:
1. 假設除 α1 之外,其他都是定值,那么據 ni=1αiyi=0,  α1可以直接定下來,就無法進行優化了。
2. 若有 α1,  α2是變量,其他是常量, α2可以由 α1來表示,代入到目標函數中,就形成了一個一元二次函數。這樣就能輕易地求極值了。其中,還是要考慮約束條件的:
αiα
i
0 <= ai <= C. 總之,求極值是方便可行多了。
 
采用此方法,選取不同的 αi,  αj求極值。 然后選取最大的。
SMO就是采用這種原理,只不過它不是依次或隨機選取 α,而是采用啟發式算法選取最優的兩個維度。
 John C. Platt 的那篇論文 Fast Training of Support Vector Machines Using Sequential Minimal Optimization,有原理,有偽代碼可以參考。
 
http://blog.pluskid.org/?page_id=683
介紹的也是比較深入淺出的。
 

3. SVM種類有哪些,適用場景及優缺點

SVM的空間復雜度:
SVM 是所占內存,是樣本數據量的平方。
《A Tutorial on Support Vector Machines for Pattern Recognition》  1998KluwerAcademicPublishers,Boston,訓練計算復雜度在O(Nsv^3+LNsv^2+d*L*Nsv)和O(d*L^2)之間,其中Nsv是支持向量的個數,L是訓練集樣本的個數,d是每個樣本的維數(原始的維數,沒有經過向高維空間映射之前的維數).
 
總的來講,SVM的SMO算法根據不同的應用場景,其算法復雜度為~N 到~N^2.2之間,而chunking scale的復雜度為~N^1.2 到~N^3.4之間。一般SMO比chunking算法有一階的優勢。
線性SVM比非線性SVM的smo算法要慢一些。所以,據原著論文的測試,SMO算法,在線性svm上快1000倍,在非線性上快15倍。
 
對於SVM的SMO算法的內存需求時線性的,這使得其能適用比較大的訓練集。
 
所以,如果數據量很大,SVM的訓練時間就會比較長,如垃圾郵件的分類檢測,沒有使用SVM分類器,而是使用了簡單的naive bayes分類器,或者是使用邏輯回歸模型分類。
 
---------------------
其他觀點:
SVM在小樣本訓練集上能夠得到比其它算法好很多的結果。支持向量機之所以成為目前最常用,效果最好的分類器之一,在於其優秀的泛化能力,這是是因為其本身的優化目標是結構化風險最小,而不是經驗風險最小,因此,通過margin的概念,得到對數據分布的結構化描述,因此減低了對數據規模和數據分布的要求。
 
SVM也並不是在任何場景都比其他算法好,對於每種應用,最好嘗試多種算法,然后評估結果。如SVM在郵件分類上,還不如邏輯回歸、KNN、bayes的效果好。
 
 
SVM各個參數的含義?
sigma: rbf核函數的參數,用於生成高維的特征,常用的有幾種核函數,如徑向核函數,線性核函數,這個也需要憑經驗來選擇。
C:懲罰因子。在最優化函數中,對離群點的懲罰因子,也是對離群點的重視程度體現。這個也是憑經驗和實驗來選擇。
 
SVM種類:
C-SVM: 分類型SVM,需要調優的參數有懲罰因子C,核函數參數。 C的取值 10^-4, 10^-3, 10^-2,... 到 1, 5... 依次變大
nu-SVM: 分類型SVM, 在一定程度上與C-SVM相同,將懲罰因子C換成了因子nu。其最優化的函數略有不同。nu的取值是0-1,一般取值從0.1到0.8. 0代表樣本落入間隔內的數目最小的情況,1代表樣本可以落入間隔可以很多的情況。
wiki上的原話:
The main motivation for the nu versions of SVM is that it has a has a more meaningful interpretation. This is because nu represents an upper bound on the fraction of training samples which are errors (badly predicted) and a lower bound on the fraction of samples which are support vectors. Some users feel nu is more intuitive to use than C or epsilon. 
 
C-SVR: 用於回歸的svm模型
nu-SVR:同上
 
 
---------------------------

4. 其他相關概念:

VC維:將N個點進行分類,如分成兩類,那么可以有2^N種分法,即可以理解成有2^N個學習問題。若存在一個假設H,能准確無誤地將2^N種問題進行分類。那么這些點的數量N,就是H的VC維。 這個定義真生硬,只能先記住。一個實例就平面上3個點的線性划分的VC維是3. 而平面上 VC維不是4,是因為不存在4個樣本點,能被划分成2^4 = 16種划分法,因為對角的兩對點不能被線性划分為兩類。更一般地,在r 維空間中,線性決策面的VC維為r+1。
 
置信風險: 分類器對 未知樣本進行分類,得到的誤差。也叫期望風險。
經驗風險: 訓練好的分類器,對訓練樣本重新分類得到的誤差。即樣本誤差
結構風險:[置信風險, 經驗風險], 如(置信風險 + 經驗風險) / 2
 
置信風險的影響因素有: 訓練樣本數目和分類函數的VC維。訓練樣本數目,即樣本越多,置信風險就可以比較小;VC維越大,問題的解的種類就越多,推廣能力就越差,置信風險也就越大。因此,提高樣本數,降低VC維,才能降低置信風險。
 
而一般的分類函數,需要提高VC維,即樣本的特征數據量,來降低經驗風險,如多項式分類函數。如此就會導致置信風險變高,結構風險也相應變高。過學習overfit,就是置信風險變高的緣故。
 
結構風險最小化SRM(structured risk minimize)就是同時考慮經驗風險與結構風險。在小樣本情況下,取得比較好的分類效果。保證分類精度(經驗風險)的同時,降低學習機器的 VC 維,可以使學習機器在整個樣本集上的期望風險得到控制,這應該就是SRM的原則。
 
當訓練樣本給定時,分類間隔越大,則對應的分類超平面集合的 VC 維就越小。(分類間隔的要求,對VC維的影響)
 
根據結構風險最小化原則,前者是保證經驗風險(經驗風險和期望風險依賴於學習機器函數族的選擇)最小,而后者使分類間隔最大,導致 VC 維最小,實際上就是使推廣性的界中的置信范圍最小,從而達到使真實風險最小。
 
 
訓練樣本在線性可分的情況下,全部樣本能被正確地分類(咦這個不就是傳說中的yi*(w*xi+b))>=1的條件嗎),即經驗風險Remp 為 0 的前提下,通過對分類間隔最大化(咦,這個就是Φ(w)=(1/2)*w*w嘛),使分類器獲得最好的推廣性能。
 
對於線性不可分的狀況,可以允許錯分。即對於離群點降低分類間隔。將距離原來的分類面越遠,離群就越嚴重,這個距離,可以用一個值--松弛變量來表示,只有離群點才有松弛變量。當然,要對這個值加以限制,即在最小化函數里,加入一個懲罰項,里面還有一個可以人為設定的懲罰項C。當C無限的大,那么就退化為硬間隔問題,不允許有離群點,問題可能無解。若C=0,無視離群點。有時C值需要多次嘗試,獲取一個較好的值。 這個里面可分析還很多,后面再學習。
 
核函數作用:將完全不可分問題,轉換為可分或達到近似可分的狀態。
松弛變量:解決近似可分的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM