支持向量機SVM(Support Vector Machine)作爲一種可訓練的機器學習方法可以實現模式分類和非線性迴歸,本文就matlab中的LIBSVM工具箱展開說明。
在matlab中調用LIBSVM工具箱可以方便的使用LIBSVM網絡,臺灣大學的林智仁教授已經封裝好各方法,大家可以在此下載。
LIBSVM工具箱的主要函數爲svmtrain和svmpredict,調用格式爲
model = svmtrain(train_lable,train_data,options);
[predict_lable,accuracy/mse,dec_value] = svmpredict(test_lable,test_data,model);
svmtrain:
train_lable:訓練標籤
train_data:訓練數據
options:可用的選項即表示的涵義如下
-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
其中-g選項中的k是指輸入數據中的屬性數。option -v 隨機地將數據剖分爲n部分並計算交互檢驗準確度和均方根誤差。以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將採用默認值。
下面用一個例子來解釋各參數,使用LIBSVM工具箱自帶的heart_scale.mat數據(共270個樣本,每個樣本有13個屬性)
%% A Little Clean Work
clear;
clc;
close all;
format compact;
%%
% 首先載入數據
load heart_scale;
data = heart_scale_inst;
label = heart_scale_label;
% 建立分類模型
model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
% 利用建立的模型看其在訓練集合上的分類效果
[PredictLabel,accuracy,dec_value1] = svmpredict(label,data,model);
accuracy
%% 分類模型model解密
model
Parameters = model.Parameters
Label = model.Label
nr_class = model.nr_class
totalSV = model.totalSV
nSV = model.nSV
運行結果:
Accuracy = 99.6296% (269/270) (classification)
accuracy =
99.6296
0.0148
0.9851
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
sv_indices: [259x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
Parameters =
0
2.0000
3.0000
2.8000
0
Label =
1
-1
nr_class =
2
totalSV =
259
nSV =
118
141
這裏爲了簡單起見沒有劃分訓練集和測試集,下面探究一下各個參數的意義
1、model.parameters
Parameters =
0
2.0000
3.0000
2.8000
0
從上到下依次是
-s svm類型:SVM設置類型(默認0)
-t 核函數類型:核函數設置類型(默認2)
-d degree:核函數中的degree設置(針對多項式核函數)(默認3)
-g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/ k)
-r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
參數數字的意義見上。
2、model.label model.nr_class
Label =
1
-1
nr_class =
2
model.label表示數據集中類別的標籤都有哪些,這裏是1和-1
model.nr_class表示數據集中一共有多少個類別,這裏是二分類
3、model.totalSV model.nSV
totalSV =
259
nSV =
118
141
model.totalSV 代表總共的支持向量的數目,這裏共259個支持向量
model.nSV 每類標籤的支持向量數,這裏標籤爲1的支持向量有118個,-1的有141個。
4、model.sv_coef model.SVs model.rho
model.sv_coef承裝的是259個支持向量雜決策函數中的係數
model.SVs 承裝259個支持向量
model.rho 決策函數中常數項的相反數
通過model提供的信息,可以建立上面的決策函數,代碼實現如下:
%% DecisionFunction
function plabel = DecisionFunction(x,model)
gamma = model.Parameters(4);
RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
len = length(model.sv_coef);
y = 0;
for i = 1:len
u = model.SVs(i,:);
y = y + model.sv_coef(i)*RBF(u,x);
end
b = -model.rho;
y = y + b;
if y >= 0
plabel = 1;
else
plabel = -1;
end
有了這個決策函數就可以自己預測樣本標籤了
%%
plable = zeros(270,1);
for i = 1:270
x = data(i,:);
plabel(i,1) = DecisionFunction(x,model);
end
LIBSVM官方網站有關matlab接口的FAQ地址:www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html