SVM: 實際中使用SVM的一些問題

使用SVM包來求θ,選擇C與核函數算法

咱們使用已經編寫好的軟件包(這些軟件包效率高,用得多,是經無數人證實已經很好的可使用的軟件包)來求θ,而不是本身去編寫軟件來求它們(就像咱們如今不多編寫軟件來求x½).常用的是liblinear和libsvm網絡

雖然不用咱們本身來寫optimize函數,可是須要咱們肯定的是要選擇C(cost function裏面bias與variance權衡的參數=1/λ),以及選擇什麼樣的kernel函數機器學習

一種選擇是不使用kernel(也稱爲linear kernel),直接使用x: 這種狀況是當咱們的n很大(即維度很高,features不少)可是訓練樣本卻不多的狀況下,咱們通常不但願畫出很複雜的邊界線(由於樣本不多,畫出很複雜的邊界線就會過擬合),而是用線性的邊界線函數

一種選擇是使用Gaussian kernel: 這種狀況須要肯定σ2(平衡bias仍是variance)。這種狀況是當x的維度不高,可是樣本集不少的狀況下。如上圖中,n=2,可是m卻不少,須要一個相似於圓的邊界線。(即須要一個複雜的邊界)學習

若是features的範圍差異很大,在執行kernel以前要使用feature scaling優化

咱們須要本身編寫kernel函數,固然許多SVM都包含了高斯kernel和linear kernel(由於這兩個是最多見的);本身編寫kernel函數時,將x1,x2(landmarks)作爲輸入輸出features f(f1,f2.........fm)spa

在使用高斯kernel時,若是features之間的範圍相差太大,要先作feature scaling。由於若是不作feature scaling 的話,在求範數時,則範數主要取決於大的數值的features,而不會去關注小數值的features,這樣致使不均衡。如房子價格的預測,有面積與房間個數的話,則範數主要與房子的面積相關,由於房間個數對於範數的貢獻過小。設計

成爲有效的kernels須要知足的條件以及其它的一些kernel函數調試

咱們最經常使用的是高斯kernel和linear kernel(即不使用kernel),可是須要注意的是否是任何類似度函數都是有效的核函數,它們(包括咱們常使用的高斯kernel)須要知足一個定理(默塞爾定理),這是由於SVM有不少數值優化技巧,爲了有效地求解參數Θ,須要類似度函數知足默塞爾定理,這樣才能確保SVM包可以使用優化的方法來求解參數Θ對象

一些其它可能會被用到的kernels(不多使用): 多項式核函數,將x與l(landmark)的內積作爲一種類似度的度量,如上圖所示,它的通常形式爲(xTl+constant)degree,有兩個參數,一個是constant,一個是degree。多項式核函數通常會要求x與l都是非負的,這樣它們的內積纔是正的

一些更少用到的核函數:字符串核函數-若是你輸入的數據爲字符串的話,有時會用到這個核函數,來比較兩個對象之間的類似度。卡方核函數,直方圖交叉核函數。

咱們基本上不多用到這些核函數(用得最多的是高斯kernel與linear kernel),可是碰到它們時,要知道它們爲核函數的定義.

SVM中的多分類問題

當咱們遇到多分類的問題時,如何有效地畫出多分類的邊界呢?

大多數的SVM都已經內置了多分類問題的軟件包,咱們能夠直接使用。

另外一種方法時使用one-vs.-all方法(參考以前的),訓練K個SVM(若是有K個分類的話),這樣得出K個參數θ向量(每個參數θ都是將這一類與其它類分別時所求的θ),而後預測時選擇最大時的θTx所表示的那個class

logistic regression/SVM/神經網絡比較

咱們將logistic regression的cost function進行了修改得出了SVM,那麼咱們在什麼狀況下應該使用什麼算法呢?

若是咱們的features要比樣本數要大的話(如n=10000,m=10-1000),咱們使用logistic regression或者linear kernel,由於在樣本較少的狀況下,咱們使用線性分類效果已經很好了,咱們沒有足夠多的樣原本支持咱們進行復雜的分類

若是n較小,m大小適中的話,使用SVM with Gaussion kernel.如咱們以前講的有一個二維(n=2)的數據集,咱們可使用高斯核函數很好的將正負區分出來.

若是n較小,m很是大的話,會建立一些features,而後再使用logistic regeression 或者linear kernel。由於當m很是大的話,使用高斯核函數會較慢

logistic regeression 與linear kernel是很是類似的算法,若是其中一個適合運行的話,那麼另外一個也頗有可能適合運行。

咱們使用高斯kernel的範圍很大,當m多達50000,n在1-1000(很常見的範圍),均可以使用SVM with 高斯kernel,能夠解決不少logistic regression不能解決的問題。

神經網絡在任何狀況下都適用,可是有一個缺點是它訓練起來比較慢,相對於SVM來講

SVM求的不是局部最優解,而是全局最優解

相對於使用哪一種算法來講,咱們更重要的是掌握更多的數據如何調試算法(bias/variance),如何設計新的特徵變量,這些都比是使用SVM仍是logistic regression重要。

可是SVM是一種被普遍使用的算法,而且在某個範圍內,它的效率很是高,是一種有效地學習複雜的非線性問題的學習算法。

logistic regression,神經網絡,SVM這三個學習算法使得咱們能夠解決不少前沿的機器學習問題。

相關文章
相關標籤/搜索