10.23 MATLAB中SVM的用法

LIBSVM是臺灣大學林智仁(Lin Chih-Jen)教授等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟件包,他不但提供了編譯好的可在Windows系列系統的執行文件,還提供了源代碼,方便改進、修改以及在其它操作系統上應用;該軟件對SVM所涉及的參數調節相對比較少,提供了很多的默認參數,利用這些默認參數可以解決很多問題;並提供了交互檢驗(Cross Validation)的功能。該軟件可以解決C-SVM、ν-SVM、ε-SVR和ν-SVR等問題,包括基於一對一算法的多類模式識別問題。注意不是matlab自帶的svm實現函數。

  1. model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);

這個函數有三個參數,其中

-training_label_vector:訓練樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。這裡可以是二分類和多分類,類標是(-1,1)、(1,2,3)或者其他任意用來表示不同的類別的數字,要轉成double類型。

-training_instance_matrix:訓練樣本的特徵,如果有m個樣本,每個樣本特徵是n維,則為m x n的矩陣(類型必須為double)。

-libsvm_options:訓練的參數,在第3點詳細介紹。

libsvmtrain函數返回訓練好的SVM分類器模型model是一個結構體,包含以下成員:

-Parameters: 一個5 x 1的矩陣,從上到下依次表示:

-s SVM類型(默認0);

-t 核函數類型(默認2)

-d 核函數中的degree設置(針對多項式核函數)(默認3);

-g 核函數中的r(gamma)函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數);

-r 核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)

-nr_class: 表示數據集中有多少類別,比如二分類時這個值即為2。

-totalSV: 表示支持向量的總數。

-rho: 決策函數wx+b中的常數項的相反數(-b)。

-Label: 表示數據集中類別的標籤,比如二分類常見的1和-1。

-ProbA: 使用-b參數時用於概率估計的數值,否則為空。

-ProbB: 使用-b參數時用於概率估計的數值,否則為空。

-nSV: 表示每類樣本的支持向量的數目,和Label的類別標籤對應。如Label=[1; -1],nSV=[63; 67],則標籤為1的樣本有63個支持向量,標籤為-1的有67個。

-sv_coef: 表示每個支持向量在決策函數中的係數。

-SVs: 表示所有的支持向量,如果特徵是n維的,支持向量一共有m個,則為m x n的稀疏矩陣。

另外,如果在訓練中使用了-v參數進行交叉驗證時,返回的不是一個模型,而是交叉驗證的分類的正確率或者回歸的均方根誤差。

當構建完成model後,還要為上述參數選擇合適的值,方法主要有Gridsearch,其他的感覺不常用,Gridsearch說白了就是窮舉。

網格參數尋優函數(分類問題):SVMcgForClass

[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)

輸入:

train_label:訓練集的標籤,格式要求與svmtrain相同。

train:訓練集,格式要求與svmtrain相同。

cmin,cmax:懲罰參數c的變化範圍,即在[2^cmin,2^cmax]範圍內尋找最佳的參數c,默認值為cmin=-8,cmax=8,即默認懲罰參數c的範圍是[2^(-8),2^8]。

gmin,gmax:RBF核參數g的變化範圍,即在[2^gmin,2^gmax]範圍內尋找最佳的RBF核參數g,默認值為gmin=-8,gmax=8,即默認RBF核參數g的範圍是[2^(-8),2^8]。

v:進行Cross Validation過程中的參數,即對訓練集進行v-fold Cross Validation,默認為3,即默認進行3折CV過程。

cstep,gstep:進行參數尋優是c和g的步進大小,即c的取值為2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值為2^gmin,2^(gmin+gstep),…,2^gmax,默認取值為cstep=1,gstep=1。

accstep:最後參數選擇結果圖中準確率離散化顯示的步進間隔大小([0,100]之間的一個數),默認為4.5。

輸出:

bestCVaccuracy:最終CV意義下的最佳分類準確率。

bestc:最佳的參數c。

bestg:最佳的參數g。

網格參數尋優函數(迴歸問題):SVMcgForRegress

[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)

其輸入輸出與SVMcgForClass類似,這裡不再贅述。

SVM 怎樣能得到好的結果:

  1. 對數據做歸一化(simple scaling)
  2. 應用 RBF kernel
  3. 用cross-validation和grid-search 得到最優的c和g
  4. 用得到的最優c和g訓練訓練數據
  5. 測試

libsvm使用誤區:

(1) 直接將訓練集合和測試集合簡單歸一化到[0,1]區間,可能導致實驗結果很差。

(2) 如果樣本的特徵數非常多,那麼就不必使用RBF核將樣本映射到高維空間。

a) 在特徵數非常多的情況下,使用線性核,結果已經非常好,並且只需要選擇參數C即可。

b) 雖然說RBF核的結果至少比線性核好,前提下搜索整個的空間。

(3) 樣本數<

(4) 樣本數和特徵數都非常多:推薦使用liblinear,更少的時間和內存,可比的準確率。

(5) 樣本數>>特徵數:如果想使用線性模型,可以使用liblinear,並且使用-s 2參數

MATLAB中SVM的用法


分享到:


相關文章: