使用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)
在使用高斯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這三個學習算法使得我們可以解決很多前沿的機器學習問題。
