【神經網絡學習筆記】LIBSVM參數講解

支持向量機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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章