SVM(support vector machine)支持向量机原理详解
生活随笔
收集整理的這篇文章主要介紹了
SVM(support vector machine)支持向量机原理详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SVM是什么?
SVM - support vector machine, 俗稱支持向量機,為一種supervised learning算法,屬于classification的范疇。
在數據挖掘的應用中,與unsupervised的Clustering相對應和區別。 廣泛應用于機器學習(Machine Learning), 計算機視覺(Computer Vision) 和數據挖掘(Data Mining)當中。 SVM大致原理如圖1,
假設我們要通過三八線把實心圈和空心圈分成兩類。 那么有無數多條線可以完成這個任務。 在SVM中,我們尋找一條最優的分界線使得它到兩邊的margin都最大。 在這種情況下邊緣加粗的幾個數據點就叫做support vector,這也是這個分類算法名字的來源。 拓展至任意n維乃至無限維空間,如圖2,
圖片引用自OpenCV:
We got a bunch of data points in a n- dimensional to infinite-dimensional space,
Then one can always find a optimal hyperplane which is always in the n-1 dimension.
那么對于所有的點集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。
推導出以下關系
(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
介紹的也是比較深入淺出的。
總的來講,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:同上
置信風險: 分類器對 未知樣本進行分類,得到的誤差。也叫期望風險。 經驗風險: 訓練好的分類器,對訓練樣本重新分類得到的誤差。即樣本誤差 結構風險:[置信風險, 經驗風險], 如(置信風險 + 經驗風險) / 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值需要多次嘗試,獲取一個較好的值。 這個里面可分析還很多,后面再學習。
核函數作用:將完全不可分問題,轉換為可分或達到近似可分的狀態。 松弛變量:解決近似可分的問題。
圖片引用自OpenCV:
怎么求解SVM?
由直觀到擬合: 直觀上,存在一個最優的超平面。 那么,我們就假設這個最優面的公式是: 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值需要多次嘗試,獲取一個較好的值。 這個里面可分析還很多,后面再學習。
核函數作用:將完全不可分問題,轉換為可分或達到近似可分的狀態。 松弛變量:解決近似可分的問題。
總結
以上是生活随笔為你收集整理的SVM(support vector machine)支持向量机原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: promise中调用ajax
- 下一篇: 在JS 中使用 fetch 初体验