在MATLAB中使用libSVM的方法
libsvm庫下載下傳:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
詳解:http://www.matlabsky.com/thread-11925-1-1.html
安裝libsvm方法,參考部落格:http://blog.csdn.net/abcjennifer/article/details/7370177
先舉一個栗子:
代碼:
<span style="font-size:12px;"> clc,clear
%4個訓練樣本4*4,每個樣本4條屬性(特征)
train_data=[5.1 3.5 1.4 0.2;4.9 3.0 1.4 0.2;4.7 3.2 1.3 0.2;4.6 3.11.5 0.2];
%4個測試樣本4*4,每個樣本4條屬性(特征)
test_data=[5.0 3.6 1.4 0.2;5.4 3.9 1.7 0.4;4.6 3.4 1.4 0.3;5.0 3.41.5 0.2];
train_labels=[1,1,2,2]';%訓練樣本标簽4*1
test_labels=[1,1,1,1]';%測試樣本标簽4*1
model = svmtrain(train_labels, train_data);
[predict_label, accuracy,dec_values] =svmpredict(test_labels,test_data, model);
</span>
結果:
optimization finished, #iter = 2
nu = 1.000000
obj = -3.872840, rho = -0.009619
nSV = 4, nBSV = 4
Total nSV = 4
Accuracy = 75% (3/4) (classification)
1.分類問題處理整體正規流程
step1. 標明訓練集和測試集 >>規範化 >> 特征提取
step2. 利用訓練集訓練分類器得到model
step3. 利用model對測試集進行預測
step4. 分類器性能評測[分類準确率的高低
2.svmtrain(… ) 通過訓練集來訓練模型
函數:model= svmtrain(train_label, train_matrix, ['libsvm_options']);
-train_label:
An m by 1 vector oftraining labels (type must be double). 标簽資料應是m行1列的資料
-train_matrix:
An m by n matrix of mtraining instances with n features.
It can be dense or sparse(type must be double). 訓練資料應是m行n列,m表示樣本數,n表示1個樣本有n中屬性
-libsvm_options:
A stringof training options in the same format as that of LIBSVM. 是一個字元串如:'-c 2 -g 0.02 -t 2'
Options:可用的選項即表示的涵義如下:
-ssvm類型:SVM設定類型(預設0)
0 -- C-SVC(C-support vector classification)
1 -- nu-SVC(nu-support vectorclassification)
2 -- one-class SVM (distributionestimation) 一類SVM
3 -- epsilon-SVR(epsilon-support vectorregression)
4 -- nu-SVR (nu-support vectorregression)
-t核函數類型:核函數設定類型(預設2)
0 – 線性:u'v
1 – 多項式:(r*u'v+ coef0)^degree
2 – RBF函數:exp(-r|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
其中-g選項中的k是指輸入資料中的屬性數。option-v 随機地将資料剖分為n部分并計算互動檢驗準确度和均方根誤差。以上這些參數設定可以按照SVM的類型和核函數所支援的參數進行任意組合,如果設定的參數在函數或SVM類型中沒有也不會産生影響,程式不會接受該參數;如果應有的參數設定不正确,參數将采用預設值。
model:SVM根據樣本訓練的得到的分類器
model是struct結構[Parameters, nr_class,totalSV, rho, Label, ProbA, ProbB, nSV, sv_coef, SVs]
model.Parameters參數(均是使用者自定義或者預設的)意義從上到下依次為:
-s svm類型:SVM設定類型(預設0)
-t 核函數類型:核函數設定類型(預設2)
-d degree:核函數中的degree設定(針對多項式核函數)(預設3)
-g r(gama):核函數中的gamma函數設定(針對多項式/rbf/sigmoid核函數)(預設類别數目的倒數)
-r coef0:核函數中的coef0設定(針對多項式/sigmoid核函數)((預設0)
model.nr_class表示資料集中有多少類别;=2 for regression/one-class svm
model.Label表示資料集中類别的标簽都是什麼
model.totalSV代表總共的支援向量的數目
model.nSV表示每類樣本的支援向量的數目
model.ProbA和model.ProbB使用-b參數時才能用到,用于機率估計。
-b probability_estimates: whether to train a SVC or SVR model for probabilityestimates,0 or 1 (default 0)
model.sv_coef是一個totalSV*1的矩陣,承裝的是totalSV個支援向量在決策函數中的系數
model.SVs是一個totalSV×次元的稀疏矩陣,承裝的是totalSV個支援向量
model.rho是決策函數中的常數項的相反數
3.svmpredict(….) 對測試集進行預測
函數:[predicted_label,accuracy, decision_values/prob_estimates] = svmpredict(test_label, test_matrix,model, ['libsvm_options']);
傳回參數:
predict_label是預測标簽向量
accuracy從上到下依次的意義分别是:
-分類準率(分類問題中用到的參數名額)
-平均平方誤差(MSE(mean squared error))[回歸問題中用到的參數名額]
-平方相關系數(r2(squared correlation coefficient))[回歸問題中用到的參數名額]
dec_values是一個包含decision值或機率估計(-b1)的矩陣,如果k個類,對于decision值,每行包含k(k-1)/2個二分類問題的結果;對于機率,每列包含k個屬于每類的機率值
4.注意事項
1.測試資料的格式要求必須是每一列代表一個屬性,每一列代表一個樣本.
2.資料類型需要是double型.
3.如果自己編寫的程式使用到libsvm,就應該将libsvm中的MATLAB代碼複制到自程式設計式位置,否則MATLAB會調用自帶的SVM程式,報錯“Ymust be a vector or a character array.”
4.跟編譯器有關吧,在使用SVM做預測的時候,傳回的參數必須填全,否則出來的預測結果是空的,即是:
[predicted_label, accuracy, decision_values] =svmpredict(test_label, test_matrix, model);