1. 程式人生 > >SVM支持向量機

SVM支持向量機

滿足 優勢 運算 asa cto 原理 條件 比較 最大值和最小值

SVM有如下主要幾個特點:

(1)非線性映射是SVM方法的理論基礎,SVM利用內積核函數代替向高維空間的非線性映射;
(2)對特征空間劃分的最優超平面是SVM的目標,最大化分類邊際的思想是SVM方法的核心;
(3)支持向量是SVM的訓練結果,在SVM分類決策中起決定作用的是支持向量。
(4)SVM 是一種有堅實理論基礎的新穎的小樣本學習方法。它基本上不涉及概率測度及大數定律等,因此不同於現有的統計方法。從本質上看,它避開了從歸納到演繹的傳統過程,實現了高效的從訓練樣本到預報樣本的“轉導推理”,大大簡化了通常的分類和回歸等問題。
(5)SVM 的最終決策函數只由少數的支持向量所確定,計算的復雜性取決於支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了“維數災難”。
(6)少數支持向量決定了最終結果,這不但可以幫助我們抓住關鍵樣本、“剔除”大量冗余樣本,而且註定了該方法不但算法簡單,而且具有較好的“魯棒”性。這種“魯棒”性主要體現在:
①增、刪非支持向量樣本對模型沒有影響;
②支持向量樣本集具有一定的魯棒性;
③有些成功的應用中,SVM 方法對核的選取不敏感

兩個不足:

(1) SVM算法對大規模訓練樣本難以實施
由於SVM是借助二次規劃來求解支持向量,而求解二次規劃將涉及m階矩陣的計算(m為樣本的個數),當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。針對以上問題的主要改進有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、張學工的CSVM以及O.L.Mangasarian等的SOR算法
(2) 用SVM解決多分類問題存在困難
經典的支持向量機算法只給出了二類分類的算法,而在數據挖掘的實際應用中,一般要解決多類的分類問題。可以通過多個二類支持向量機的組合來解決。主要有一對多組合模式、一對一組合模式和SVM決策樹;再就是通過構造多個分類器的組合來解決。主要原理是克服SVM固有的缺點,結合其他算法的優勢,解決多類問題的分類精度。如:與粗集理論結合,形成一種優勢互補的多類問題的組合分類器。

應聘數據挖掘工程師或機器學習工程師,面試官經常會考量面試者對SVM的理解。

SVM的原理是什麽?

SVM是一種二類分類模型。它的基本模型是在特征空間中尋找間隔最大化的分離超平面的線性分類器。(間隔最大是它有別於感知機)

(1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機;

(2)當訓練數據近似線性可分時,引入松弛變量,通過軟間隔最大化,學習一個線性分類器,即線性支持向量機;

(3)當訓練數據線性不可分時,通過使用核技巧及軟間隔最大化,學習非線性支持向量機。

註:以上各SVM的數學推導應該熟悉:硬間隔最大化(幾何間隔)---學習的對偶問題---軟間隔最大化(引入松弛變量)

---非線性支持向量機(核技巧)。

SVM為什麽采用間隔最大化?

當訓練數據線性可分時,存在無窮個分離超平面可以將兩類數據正確分開。

感知機利用誤分類最小策略,求得分離超平面,不過此時的解有無窮多個。

線性可分支持向量機利用間隔最大化求得最優分離超平面,這時,解是唯一的。另一方面,此時的分隔超平面所產生的分類結果是最魯棒的,對未知實例的泛化能力最強

然後應該借此闡述,幾何間隔,函數間隔,及從函數間隔—>求解最小化1/2 ||w||^2 時的w和b。即線性可分支持向量機學習算法—最大間隔法的由來。

為什麽要將求解SVM的原始問題轉換為其對偶問題?

一、是對偶問題往往更易求解(當我們尋找約束存在時的最優點的時候,約束的存在雖然減小了需要搜尋的範圍,但是卻使問題變得更加復雜。為了使問題變得易於處理,我們的方法是把目標函數和約束全部融入一個新的函數,即拉格朗日函數,再通過這個函數來尋找最優點。

二、自然引入核函數,進而推廣到非線性分類問題。

為什麽SVM要引入核函數?

當樣本在原始空間線性不可分時,可將樣本從原始空間映射到一個更高維的特征空間,使得樣本在這個特征空間內線性可分。

引入映射後的對偶問題:

技術分享圖片

在學習預測中,只定義核函數K(x,y),而不是顯式的定義映射函數?。因為特征空間維數可能很高,甚至可能是無窮維,因此直接計算?(x?(y)是比較困難的。相反,直接計算K(x,y)比較容易(即直接在原來的低維空間中進行計算,而不需要顯式地寫出映射後的結果)。

核函數的定義:K(x,y)=<?(x),?(y)>,即在特征空間的內積等於它們在原始樣本空間中通過核函數K計算的結果。

除了 SVM 之外,任何將計算表示為數據點的內積的方法,都可以使用核方法進行非線性擴展。

svm RBF核函數的具體公式?

技術分享圖片

Gauss徑向基函數則是局部性強的核函數,其外推能力隨著參數σ的增大而減弱。

這個核會將原始空間映射為無窮維空間。不過,如果 σ 選得很大的話,高次特征上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當於一個低維的子空間;反過來,如果 σ 選得很小,則可以將任意的數據映射為線性可分——當然,這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數σ高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。





為什麽SVM對缺失數據敏感?

這裏說的缺失數據是指缺失某些特征數據,向量數據不完整。SVM沒有處理缺失值的策略(決策樹有)。而SVM希望樣本在特征空間中線性可分,所以特征空間的好壞對SVM的性能很重要。缺失特征數據將影響訓練結果的好壞。

SVM是用的是哪個庫?Sklearn/libsvm中的SVM都有什麽參數可以調節?

用的是sklearn實現的。采用sklearn.svm.SVC設置的參數。本身這個函數也是基於libsvm實現的(PS: libsvm中的二次規劃問題的解決算法是SMO)。

SVC函數的訓練時間是隨訓練樣本平方級增長,所以不適合超過10000的樣本。

對於多分類問題,SVC采用的是one-vs-one投票機制,需要兩兩類別建立分類器,訓練時間可能比較長。

sklearn.svm.SVC(C=1.0, kernel=‘rbf‘, degree=3, gamma=‘auto‘, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)

參數:

l C:C-SVC的懲罰參數C?默認值是1.0

C越大,相當於懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。

l kernel :核函數,默認是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’

  0 – 線性:u‘v

   1 – 多項式:(gamma*u‘*v + coef0)^degree

  2 – RBF函數:exp(-gamma|u-v|^2)

  3 –sigmoid:tanh(gamma*u‘*v + coef0)

l degree :多項式poly函數的維度,默認是3,選擇其他核函數時會被忽略。

l gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函數參數。默認是’auto’,則會選擇1/n_features

l coef0 :核函數的常數項。對於‘poly’和 ‘sigmoid’有用。

l probability 是否采用概率估計?.默認為False

l shrinking :是否采用shrinking heuristic方法,默認為true

l tol 停止訓練的誤差值大小,默認為1e-3

l cache_size :核函數cache緩存大小,默認為200

l class_weight :類別的權重,字典形式傳遞。設置第幾類的參數C為weight*C(C-SVC中的C)

l verbose :允許冗余輸出?

l max_iter :最大叠代次數。-1為無限制。

l decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3

l random_state :數據洗牌時的種子值,int值

主要調節的參數有:C、kernel、degree、gamma、coef0。

SVM如何處理多分類問題?

一般有兩種做法:一種是直接法,直接在目標函數上修改,將多個分類面的參數求解合並到一個最優化問題裏面。看似簡單但是計算量卻非常的大。

另外一種做法是間接法:對訓練器進行組合。其中比較典型的有一對一,和一對多

一對多,就是對每個類都訓練出一個分類器,由svm是二分類,所以將此而分類器的兩類設定為目標類為一類,其余類為另外一類。這樣針對k個類可以訓練出k個分類器,當有一個新的樣本來的時候,用這k個分類器來測試,那個分類器的概率高,那麽這個樣本就屬於哪一類。這種方法效果不太好,bias比較高。

svm一對一法(one-vs-one),針對任意兩個類訓練出一個分類器,如果有k類,一共訓練出C(2,k) 個分類器,這樣當有一個新的樣本要來的時候,用這C(2,k) 個分類器來測試,每當被判定屬於某一類的時候,該類就加一,最後票數最多的類別被認定為該樣本的類。

機器學習關於支持向量機的面試題總結

2018年03月16日 21:07:08

閱讀數:386

1.SVM的原理是什麽?
SVM是一種二類分類模型。它的基本模型是在特征空間中尋找間隔最大化的分離超平面的線性分類器。(間隔最大是它有別於感知機)
(1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機;
(2)當訓練數據近似線性可分時,引入松弛變量,通過軟間隔最大化,學習一個線性分類器,即線性支持向量機;
(3)當訓練數據線性不可分時,通過使用核技巧及軟間隔最大化,學習非線性支持向量機。

註:以上各SVM的數學推導應該熟悉:硬間隔最大化(幾何間隔)---學習的對偶問題---軟間隔最大化(引入松弛變量)---非線性支持向量機(核技巧)。

2.SVM為什麽采用間隔最大化?

當訓練數據線性可分時,存在無窮個分離超平面可以將兩類數據正確分開。利用間隔最大化求得最優分離超平面,這時,解是唯一的。另一方面,此時的分隔超平面所產生的分類結果對未知實例的泛化能力最強。

3.為什麽要將求解SVM的原始問題轉換為其對偶問題?
一、是對偶問題往往更易求解,(當我們尋找約束存在時的最優點的時候,約束的存在雖然減小了需要搜尋的範圍,但是卻使問題變得更加復雜。為了使問題變得易於處理,我們的方法是把目標函數和約束全部融入一個新的函數,即拉格朗日函數,再通過這個函數來尋找最優點。)
(a)目前處理的模型嚴重依賴於數據集的維度d,如果維度d太高就會嚴重提升運算時間;
(b)對偶問題把SVM從依賴d個維度轉變到依賴N個數據點,最後計算時只有支持向量有意義,所以計算量比N小很多。

二、自然引入核函數,進而推廣到非線性分類問題。

4.為什麽SVM要引入核函數?
當樣本在原始空間線性不可分時,可將樣本從原始空間映射到一個更高維的特征空間,使得樣本在這個特征空間內線性可分。引入映射後的對偶問題:
在學習預測中,只定義核函數K(x,y),而不是顯式的定義映射函數?。因為特征空間維數可能很高,甚至可能是無窮維,因此直接計算?(x)·?(y)是比較困難的。相反,直接計算K(x,y)比較容易(即直接在原來的低維空間中進行計算,而不需要顯式地寫出映射後的結果)。
核函數的定義:K(x,y)=<?(x),?(y)>,即在特征空間的內積等於它們在原始樣本空間中通過核函數K計算的結果。

除了 SVM 之外,任何將計算表示為數據點的內積的方法,都可以使用核方法進行非線性擴展。

5.svm RBF核函數的具體公式?
Gauss徑向基函數則是局部性強的核函數,其外推能力隨著參數σ的增大而減弱。

這個核會將原始空間映射為無窮維空間。不過,如果 σ 選得很大的話,高次特征上的權重實際上衰減得非常快,所以實際上相當於一個低維的子空間;反過來,如果 σ 選得很小,則可以將任意的數據映射為線性可分——當然這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數σ ,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。

6.為什麽SVM對缺失數據敏感?

這裏說的缺失數據是指缺失某些特征數據,向量數據不完整。SVM沒有處理缺失值的策略(決策樹有)。而SVM希望樣本在特征空間中線性可分,所以特征空間的好壞對SVM的性能很重要。缺失特征數據將影響訓練結果的好壞。

7.SVM是用的是哪個庫?Sklearn/libsvm中的SVM都有什麽參數可以調節?
用的是sklearn實現的。采用sklearn.svm.SVC設置的參數。本身這個函數也是基於libsvm實現的(PS: libsvm中的二次規劃問題的解決算法是SMO)。
SVC函數的訓練時間是隨訓練樣本平方級增長,所以不適合超過10000的樣本。
對於多分類問題,SVC采用的是one-vs-one投票機制,需要兩兩類別建立分類器,訓練時間可能比較長。
sklearn.svm.SVC(C=1.0, kernel=‘rbf‘, degree=3, gamma=‘auto‘, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
參數:
C:C-SVC的懲罰參數C,默認值是1.0。C越大,相當於懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。
kernel :核函數,默認是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
  0 – 線性:u‘v
   1 – 多項式:(gamma*u‘*v + coef0)^degree
  2 – RBF函數:exp(-gamma|u-v|^2)
  3 –sigmoid:tanh(gamma*u‘*v + coef0)
degree :多項式poly函數的維度,默認是3,選擇其他核函數時會被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函數參數。默認是’auto’,則會選擇1/n_features
coef0 :核函數的常數項。對於‘poly’和 ‘sigmoid’有用。
max_iter :最大叠代次數。-1為無限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3

主要調節的參數有:C、kernel、degree、gamma、coef0。

8.SVM如何處理多分類問題?
一般有兩種做法:
一種是直接法,直接在目標函數上修改,將多個分類面的參數求解合並到一個最優化問題裏面。看似簡單但是計算量卻非常的大。
另外一種做法是間接法:對訓練器進行組合。其中比較典型的有一對一,和一對多。
? 一對多,就是對每個類都訓練出一個分類器,由svm是二分類,所以將此二分類器的兩類設定為目標類為一類,其余類為另外一類。這樣針對k個類可以訓練出k個分類器,當有一個新的樣本來的時候,用這k個分類器來測試,那個分類器的概率高,那麽這個樣本就屬於哪一類。這種方法效果不太好,bias比較高。

? 一對一法(one-vs-one),針對任意兩個類訓練出一個分類器,如果有k類,一共訓練出C(2,k) 個分類器,這樣當有一個新的樣本要來的時候,用這C(2,k) 個分類器來測試,每當被判定屬於某一類的時候,該類就加一,最後票數最多的類別被認定為該樣本的類。

10、 類和和少數類采用不同的懲罰因子,對正例和負例賦予不同的C值,例如正例遠少於負例,則正例的C值取得較大,這種方法的缺點是可能會偏離原始數據的概率分布;
2)、對訓練集的數據進行預處理即對數量少的樣本以某種策略進行采樣,增加其數量或者減少數量多的樣本,典型的方法如:隨機插入法,缺點是可能出現 overfitting,較好的是:Synthetic Minority Over-sampling TEchnique(SMOTE),其缺點是只能應用在具體的特征空間中,不適合處理那些無法用特征向量表示的問題,當然增加樣本也意味著訓練時間可能增加;

3)、基於核函數的不平衡數據處理。

11、樣本失衡時,如何評價分類器的性能好壞?

答:使用ROC曲線

12、數據維度大於數據量的對SVM的影響?

答:這種情況下一般采用線性核(即無核),因為此時特征夠用了(很大可能是線性問題),沒必要映射到更高維的特征空間。

13、怎麽用SVM解決多分類問題?參考1;參考2
答:1)一對一法:任意兩類樣本之間設計一個SVM,最終有k(k-1)/2個分類器,投票決定,libsvm是這麽做的。雖然分類器多,但是訓練總時間要比一對多的速度快,因為訓練復雜度是跟樣本量有關的。
2)一對多法:最終k個分類器,最終如果只有一個+1,則分為該類;如果有多個+1(分類重疊),則取wx+b的值最大的那個;如果沒有+1(不可分),則分為其余類,會造成數據集傾斜問題。PS:當樣本可以屬於多個類別時,采取這種方式。

3)DAG法:用一對一的方法建立k(k-1)/2個分類器,然後將這些分類器建立成有向無環圖(有點像二叉樹);預測的時候,都只需要調用k-1個分類器;缺點是存在錯誤累積,一旦開始分類錯的話,接下來就不可能分對了。所以第一個分類器一定要選好

14、數據不規範化對SVM的影響?參考

答:大值特征會掩蓋小值特征(內積計算)。高斯核會計算向量間的距離,也會產生同樣的問題;多項式核會引起數值問題。影響求解的速度。數據規範化後,會丟失一些信息。預測的時候,也要進行規範化,測試數據規劃時,使用的最大值和最小值都是訓練集的而不是測試集的。

15、如何處理離散型變量?參考

答:{red, green, blue} 可以表示為 (0,0,1), (0,1,0), and (1,0,0);這樣向量的內積或距離才有真正意義。

16、如何選擇核函數?參考1;參考2;參考3;參考4
答:線性核是高斯核的特例,對於特征非常多的情況下,應使用線性核。因為此時特征夠用了(很大可能是線性問題),沒必要映射到更高維的特征空間,線性核的訓練速度快,而且一般情況下效果還不錯,尤其是維度高的情況下。
sigmoid核在給定的參數下和高斯核相似
多項式核的參數太多;對於高斯核0<Kij<1,而多項式核則可能會出現無窮大或無窮小;
其他核需要調參(使用交叉驗證),所以速度慢。

高斯核必然映射到無窮維,因為核函數的泰勒展開有無窮多項。

17、為什麽SVM訓練的時候耗內存,而預測的時候占內存少?
答:因為SVM訓練過程中需要存儲核矩陣。而預測的時候只需要存儲支持向量和相關參數。

詳細回答:算法最耗時的地方是優化乘子的選擇和更新一階導數信息,這兩個地方都需要去計算核函數值,而核函數值的計算最終都需要去做內積運算,這就意味著原始空間的維度很高會增加內積運算的時間;對於dense matrix我就直接用numpy的dot了,而sparse matrix采用的是CSR表示法,求它的內積我實驗過的方法有三種,第一種不需要額外空間,但時間復雜度為O(nlgn),第二種需要一個hash表(用dictionary代替了),時間復雜度為線性,第三種需要一個bitmap(使用BitVector),時間復雜度也為線性,實際使用中第一種速度最快,我就暫時用它了,應該還有更快的方法,希望高人們能指點一下;另外由於使用dictionary緩存核矩陣,遇到訓練數據很大的數據集很容易掛掉,所以在程序中,當dictionary的內存占用達到配置文件的閾值時會將其中相對次要的元素刪掉,保留對角線上的內積值。

18、在SMO中,什麽叫違反KKT條件最嚴重的?
答:每一個α對應一個樣本,而KKT條件是樣本和對應的α應該滿足的關系。所謂違反最嚴重是指α對應的樣本錯得最離譜

19、SVM適合處理什麽樣的數據?
答:高維稀疏,樣本少。【參數只與支持向量有關,數量少,所以需要的樣本少,由於參數跟維度沒有關系,所以可以處理高維問題】高維問題還可以另外一個角度來思考,假設給定一個訓練數據集,其特征是少量的,那麽很可能需要映射到高維空間才能求解,那麽這個問題就是一個高維問題

20、線性核VS多項式核VS徑向基核?
答:1)訓練速度:線性核只需要調節懲罰因子一個參數,所以速度快;多項式核參數多,難調;徑向基核函數還需要調節γ,需要計算e的冪,所以訓練速度變慢。【調參一般使用交叉驗證,所以速度會慢】
2)訓練結果:線性核的得到的權重w可以反映出特征的重要性,從而進行特征選擇;多項式核的結果更加直觀,解釋性強;徑向基核得到權重是無法解釋的。

3)適應的數據:線性核:樣本數量遠小於特征數量(n<<m)【此時不需要映射到高維】,或者樣本數量與特征數量都很大【此時主要考慮訓練速度】;徑向基核:樣本數量遠大於特征數量(n>>m)

21、徑向基核函數中參數的物理意義
答:如果σ選得很大的話,高次特征上的權重實際上衰減得非常快,使用泰勒展開就可以發現,當很大的時候,泰勒展開的高次項的系數會變小得很快,所以實際上相當於一個低維的子空間;

如果σ選得很小,則可以將任意的數據映射為線性可分——當然,這並不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題,因為此時泰勒展開式中有效的項將變得非常多,甚至無窮多,那麽就相當於映射到了一個無窮維的空間,任意數據都將變得線性可分

SVM支持向量機