一、安裝
http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/。在這個地址上可以下的包含matlab接口的源程序。下載完后可以放到放到任意的盤上解壓,最好建一個專門來放matlab程序的文件夾。打開matlab,在matlab的面板上找到set path選項(不同版本不一樣R2010b在file菜單下),將剛下載的libsvm整個目錄都添加到matlab的搜索路徑里。然后將當前路徑定位到libsvm/matlab目錄下(在current floder(matlab界面中間上方可以設置))。如果你的電腦是64位一般不需要編譯生成mex文件,因為文件已經提前編譯好了。如果是32位的話,那么需要點擊make.m文件運行編譯生成mex文件。這一步有可能不成功,可以輸入mex-setup查看選擇C++編譯器,如果找不到編譯器,那么下載安裝visual studio。成功編譯完成后,在任意的matlab程序中都可以使用libsvm了。
二、使用
在使用之前,要對libsvm做一個了解,而最好的資料自然是libsvm種README文件了。README文件包含了介紹,安裝,SVM返回的模型參數,以及例子等。Libsvm主要用了兩個函數svmtrain,svmpredict,如果你在用的時候忘了具體的參數,可以在matlab命令提示符下輸入函數名就有相關的提示。
用法:1.model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);
(1)training_label_vector, training_instance_matrix :
training_label_vector和training_instance_matrix就是要訓練的標簽和特征了。training_label_vector一般以列向量的形式存放的,每個元素即每行代表一個instance(一般是特征)的標簽。而training_instance_matrix也類似每行代表一個instance.
如圖所示,上面變量代表有930個instance來訓練,每個instance1116維,下面是對於instance的標簽。
(2)Libsvm_options:
怎么選擇呢?libsvm_options:重要的是-t,以及交叉驗證時的-v
-s svm類型:SVM設置類型,一般默認0不用設置
0 -- C-SVC(多類分類) 1 --v-SVC(多類分類) 2 –一類SVM 3 -- e –SVR 4 -- v-SVR
-t 核函數類型:核函數設置類型(默認2)
0 –線性:u'v 1 –多項式:(r*u'v + coef0)^degree 2 – RBF函數:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-d degree:核函數中的degree設置(針對多項式核函數)(默認3)
-g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/ k)
-r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
-c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1)
-n nu:設置v-SVC,一類SVM和v- SVR的參數(默認0.5)
-p p:設置e -SVR 中損失函數p的值(默認0.1)
-m cachesize:設置cache內存大小,以MB為單位(默認40)
-e eps:設置允許的終止判據(默認0.001)
-h shrinking:是否使用啟發式,0或1(默認1)
-wi weight:設置第幾類的參數C為weight*C(C-SVC中的C)(默認1)
-v n: n-fold交互檢驗模式,n為fold的個數,必須大於等於2
(3)返回的model:
如上圖 -Parameters: 參數。
-nr_class: 類的數目。
-totalSV:總的支持向量數目。
-rho: -判決函數wx+b的b。
-Label: 每個類的標簽。
-ProbB: 成對的概率信息,如果b是 0則為空。
-nSV: 每個類的支持向量
-sv_coef:判決函數的系數
-SVs:支持向量。
如果指定了'-v',那么就實施了交叉驗證,而且返回是交叉驗證的正確率。
用法:
2. [predicted_label, accuracy, decision_values/prob_estimates] = svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);
(1)esting_label_vector, testing_instance_matrix:
類似於svmtrain
(2)libsvm_options:
-b 概率估計:默認0,1表示估計。(需要在使用時顯式表現)
(3)predicted_label, accuracy, decision_values/prob_estimates:
predicted_label: SVM 預測輸出向量。類似於輸入的label
accuracy: 向量包括正確率,均方誤差,方相關系數.
decision_values:每行是預測k(k-1)/2二類SVMs的結果
prob_estimates: 每行包括k個值代表每類中測試數據所占的概率。
三、核函數
核函數的 目的是將特征向量映射到高維空間。SVM通過在高維空間尋找最大的間距的分類超平面。
核函數總共有以下4種,我們要了解在什么情況下用哪一種核函數。
一般情況下,首選RBF核,它能夠把樣本以非線性的方式映射到高維空間,所以能夠處理類標簽和特征不是線性關系的情況。線性核只是RBF的一種特殊情況。
但是有些情況下RBF核並不適用,比如特征的數量特別大的時候,一般僅僅使用線性核。
四、調參-交叉驗證和網格搜索
RBF核中有兩個參數需要確定 。我們並不知道怎么樣的
是最適用於給定的問題的。最常用的方式就是交叉驗證即把訓練的數據分成兩部分,把一部分當成知道的,另一部分是不知道的。比如在v-fold 交叉驗證中,先把訓練數據分成v個相同大小的子集。然后用v-1子集的訓練數據訓練分類器,用剩下一個子集來測試分類器。交叉驗證能夠解決過擬合的問題。要怎么利用交叉驗證來選取最好的
呢?一般是利用網格搜索,己將
組成的坐標系分成一系列網格。然后用網格上點(即對於一個個
)做交叉驗證,取使最后交叉驗證的正確率最高的參來做為最終的參數。
ps:什么時候用RBF,什么時候用線性核
1.樣本數量遠遠小於特征數時
比如訓練和測試數據有二三十個而特征維數有好幾千時,采用線性核是最好的,不需要映射數據。
2.樣本數量和特征數都非常大時
可以利用另一工具箱LIBLINEAR,或者用線性核
3.樣本數量遠遠大於特征數時
用非線性核是最好的了。
參考文獻:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf