LIBSVM和LIBLINEAR都提供了多種不一樣的模型供使用者選擇,不一樣的模型有各自適用的場景。下面分別介紹LIBSVM和LIBLINEAR所提供的各類模型。算法
下面是LIBSVM幫助內容提供的介紹,給出了LIBSVM支持的5種模型。其中模型0和1對應的都是SVM的分類模型,2對應的是one-class分類器,也就是隻須要標註一個標籤,模型3和4對應的是SVM的迴歸模型。緩存
LIBSVM包含的各類模型:框架
-s svm_type : set type of SVM (default 0) 0 -- C-SVC (multi-class classification) 1 -- nu-SVC (multi-class classification) 2 -- one-class SVM 3 -- epsilon-SVR (regression) 4 -- nu-SVR (regression)
首先來看最基礎的C-SVC模型。SVM能夠寫成以下的優化目標函數(這裏不詳細介紹推導算法了):
當模型使用linear kernel,也就是ϕ(x)=x時,上面的問題一個標準的二次凸優化問題,能夠比較方便的對每個變量進行求導。求解這樣的問題是有不少快速的優化方法的,這些方法在LIBLINEAR中都有應用。可是若是是引入kernel的SVM,狀況就大不同了。由於不少時候咱們既不能獲得核函數的具體形式,又沒法獲得特徵在覈空間中新的表達。這個時候,以前用在線性SVM上的的求解思路就徹底不work了。爲了解決這個問題,就必須採用標準的SVM求解思路,首先把原問題轉化爲對偶問題,獲得下面的目標函數(具體過程能夠參考任何介紹SVM的資料):函數
經過對偶變化,上面的目標函數變成了一個關於變量α的二次型。很顯然,上面目標函數中最重要的常亮是矩陣Q,既訓練樣本的Kernel Matrix,知足$$Q_{i.j}=ϕ(x_i)^Tϕ(x_j)$$
先看好的一方面,根據核函數的定義,可以保證Q是一個正定的矩陣。也就是說,上面的目標函數仍是一個凸函數,優化收斂後能保證獲得的解是全局最優解, 這也是SVM的重要優點之一。可是問題也隨之而來,使用經常使用的核函數,只要任意給出兩個向量,老是可以計算出一個非0的距離。這也就意味着矩陣Q將會是一個很是稠密的矩陣,若是訓練樣本足夠多,那麼矩陣Q的存儲和計算將成爲很大的問題,這也是SVM的優化算法中的最大挑戰。工具
因爲矩陣Q過大,因此想一次性優化整個α是比較困難的。因此經常使用的方法都是先把Q大卸八塊,每次選擇一部分的Q,而後update與這部分Q相關的α的值。這其中最著名的算法就是1998由John C. Platt提出的SMO算法,而LIBSVM的優化過程也是基於SMO算法進行的。SMO算法的每一步迭代都選擇最小的優化單元,也就是固定其餘的α,只挑選兩個α的值進行優化。之因此不選擇一個,是由於有$$y^Tα=0$$
的約束,至少選擇兩個α的座標纔有可能進行更新。本文主要目的是介紹LIBSVM,因此就不詳細討論SMO的細節了。至於LIBSVM中的具體算法實現,在LIBSVM的官方論文中介紹的很詳細,這裏總結部分關鍵問題:學習
Working Set,也就是須要優化的α部分的選取優化
迭代中止條件的設置spa
α的更新算法,也就是每一步子問題的求解方法code
Shrinking,即移除一些已經知足條件的α,加快收斂速度blog
Cache,當Q矩陣過大時,須要對矩陣進行緩存。
上面的每一個問題,處理起來都不簡單。做爲使用者,或許也沒有必要深諳裏面的全部細節。我以爲最須要認識的兩個問題是:
1) SVM的目標函數看起來好像是一個標準的優化問題,但實際求解卻要複雜得多。爲了提升求解的速度,既要作算法上的優化,也須要作工程上的改進。若是隻是簡簡單單按照教科書的方法,甚至直接調用一些優化的工具包來實現的SVM算法,最多也就算個demo。要可以真正寫一個高效穩定、能處理大規模數據的SVM工具仍是很是不容易的。因此用LIBSVM仍是比本身實現算法要簡單靠譜很多。
2)SVM的求解之因此要優化,就是由於這個問題自己計算和存儲比較麻煩。因此雖然作了這麼多的優化,整個算法求解的效率仍然較低。因此咱們在使用時還要注意各類程序的細節,提升運行的效率。另外,樣本量過大時,有時候爲了充分利用數據,也不得不忍痛割愛,放棄kernel的使用。
除了標準的C-SVM,LIBSVM也提供了對其餘一些SVM方法的支持。其中ν-SVM與C-SVM的算法與應用場景基本是相同的,惟一的區別是本來的參數C變成了參數ν。C-SVM中參數C調整範圍在[0,+∞),而ν-SVM中與之對應的參數ν的調整範圍變成了 (0,1]。這樣的設置使得ν-SVM更具解釋性,有時在參數設置上也能提供必定的方便。但ν-SVM與C-SVM並不存在本質上的差異,經過參數的調節,二者能夠達到徹底相同的效果。因此在使用LIBSVM處理分類問題是,選擇上面任何一種方法都是OK的,只須要遵循本身的習慣就行了。
One-Class SVM也是LIBSVM所支持的一種分類方法。顧名思義,使用One Class時,只須要提供一類樣本,算法會學習一個儘可能小的超球面包裹全部的訓練樣本。One-Class SVM看起來頗有誘惑力,由於咱們常常會遇到有一類樣本而須要學習分類器的狀況。但事實上,一方面不少時候咱們獲得的正樣本在採樣過程當中存在很大的誤差,致使學習出的One Class分類器不必定考慮到了全部正樣本的情形;另外一方面,大部分問題仍是存在不少構造人工負樣本的辦法。根據個人經驗,採用普通的SVM效果一般仍是會好過One-Class SVM,而One-Class SVM在真實場景中的使用也並算不上多。所以在使用這個方法前也須要對問題進行更深刻的研究。
最後,LIBSVM也支持基於SVM的迴歸模型,即SVR。與分類模型相似,SVR也分爲C-SVR和ν-SVR。SVR的目標函數與SVM的分類模型稍有區別。因爲迴歸問題預測值與目標值的誤差可大可小,所以SVR使用了兩個slack variable用來刻畫預測的偏差邊界。雖然存在這樣的差異,可是二者的基本思路和優化算法與仍是基本一致的。
在LIBSVM的實現中,上面五種模型,即C-SVM,ν-SVM,One-class SVM,C-SVR,ν-SVR,最終均可以轉化爲一個更通用的優化框架,而後用一樣的策略進行求解,這也是LIBSVM所實現的主要功能。在實際使用中,最經常使用到的方法仍是C-SVM,這是最傳統的SVM分類模型。