1. 程式人生 > >Libsvm各主要函式引數詳解

Libsvm各主要函式引數詳解

   最近在看limsvm決定把自己的一些收穫寫下來,其中包含了本人查詢的一些資料以及個人的一些見解。我想談一談libsvm中model函式的引數的具體表示。我使用的svm工具箱是臺灣大學林智仁教授編寫的lisvm下載地址點選開啟連結,這是目前最流行也是最好用的svm工具箱。Matlab安裝使用svm的詳細步驟可以參考以下兩個連線詳解點選開啟連結視訊點選開啟連結,這裡不再贅述。本人用的是libsvm-3.17版本。

下面結合matlab程式碼給出詳解:

clc;
clear;
close all;

%匯入資料其中wine_SVM是一個178*13行矩陣行表示共有178個特徵值每個特徵值有13個屬性


load wine_SVM;

%為簡化程式執行代價我們這裡只取wine_SVM中的第一,二列。即取13個屬性中的第一二個屬性此時data是一個178*2行的矩陣也就是有178個特徵值每個特徵值有2個屬性
data = [wine(:,1),wine(:,2)];
groups = ismember(wine_labels,1);

[train, test] = crossvalind('holdOut',groups);

                              
%選出訓練集

train_wine = data(train,:);
train_wine_labels = groups(train,:);

train_wine_labels = double( train_wine_labels );

%選出測試集

test_wine = data(test,:);
test_wine_labels = groups(test,:);
test_wine_labels = double( test_wine_labels );

%svmtrain是libsvm中最主要的函式之一,主要功能是得出訓練超平面

model = svmtrain(train_wine_labels,train_wine,'-c 1 -g 0.07');
model

%svmpredict是libsvm中最主要的函式,功能是預測測試集的分類效果

[predict_label, accuracy, decision_values] = svmpredict(test_wine_labels,test_wine,model);
accuracy

%以下是繪圖函式程式碼,直觀顯示分類效果

figure;
hold on;
[m,n] = size(train_wine);
for run = 1:m
    if train_wine_labels(run) == 1
        h1 = plot( train_wine(run,1),train_wine(run,2),'r+' );
    else
        h2 = plot( train_wine(run,1),train_wine(run,2),'g*' );
    end
    for i = 1:mm
        if model.SVs(i,1)==train_wine(run,1) && model.SVs(i,2)==train_wine(run,2)
            h3 = plot( train_wine(run,1),train_wine(run,2),'o' );
        end
    end
end
legend([h1,h2,h3],'1','0','Support Vectors');
hold off;

執行結果:

optimization finished, #iter = 37
nu = 0.555556
obj = -42.305155, rho = 0.769301 
nSV = 51, nBSV = 48
Total nSV = 51

model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 51
           rho: 0.7693
         Label: [2x1 double]
    sv_indices: [51x1 double]
         ProbA: []
         ProbB: []
           nSV: [2x1 double]
       sv_coef: [51x1 double]
           SVs: [51x2 double]

Accuracy = 88.6364% (78/88) (classification)

accuracy =

   88.6364
    0.1136
    0.5518

 

現簡單對螢幕回顯資訊進行說明:

#iter為迭代次數,

nu 設定nu - SVC、one-class-SVM 與nu - SVR 中引數nu ,預設值0.5

obj為SVM檔案轉換為的二次規劃求解得到的最小值,

rho 為判決函式的常數項b,

nSV 為支援向量個數,

nBSV為邊界上的支援向量個數,

Total nSV為支援向量總個數。

這裡面要說一下返回引數accuracy的三個引數的意義。

返回引數accuracy從上到下依次的意義分別是:
分類準率(分類問題中用到的引數指標)
平均平方誤差(MSE (mean squared error)) [迴歸問題中用到的引數指標]
平方相關係數(r2 (squared correlation coefficient))[迴歸問題中用到的引數指標]

Svmtrain函式的用法:svmtrain (training_label,train_data,[options])

其中options涵義如下:

-s svm型別:設定SVM 型別,預設值為0,可選型別有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t 核函式型別:設定核函式型別,預設值為2,可選型別有:

0 -- 線性核:u'*v

1 -- 多項式核:(g*u'*v+ coef0)degree

2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid 核:tanh(g*u'*v+ coef 0)

-d degree:核函式中的degree設定,預設值為3;

-g r(gama):核函式中的函式設定(預設1/ k);

-r coef 0:設定核函式中的coef0,預設值為0;

-c cost:設定C- SVC、e - SVR、n - SVR中從懲罰係數C,預設值為1;

-n nu :設定nu - SVC、one-class-SVM 與nu - SVR 中引數nu ,預設值0.5;

-p e :核寬,設定e - SVR的損失函式中的e ,預設值為0.1;

-m cachesize:設定cache記憶體大小,以MB為單位(預設40):

-e e :設定終止準則中的可容忍偏差,預設值為0.001;

-h shrinking:是否使用啟發式,可選值為0 或1,預設值為1;

-b 概率估計:是否計算SVC或SVR的概率估計,可選值0 或1,預設0;

-wi weight:對各類樣本的懲罰係數C加權,預設值為1;

-v n:n折交叉驗證模式。

其中-g選項中的k是指輸入資料中的屬性數。操作引數 -v 隨機地將資料剖分為n 部分並計算交叉檢驗準確度和均方根誤差。以上這些引數設定可以按照SVM 的型別和核函式所支援的引數進行任意組合,如果設定的引數在函式或SVM 型別中沒有也不會產生影響,程式不會接受該引數;如果應有的引數設定不正確,引數將採用預設值。training_set_file是要進行訓練的資料集;model_file是訓練結束後產生的模型檔案,該引數如果不設定將採用預設的檔名,也可以設定成自己慣用的檔名。

svmpredict函式的用法:

[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)

關於svmpredict有以下幾點說明在老版的libsvm中[predicted_label, accuracy]=svmpredict(test_label,teat_data,model)不會有錯,但是在libsvm3.17版本中會報錯,這是因為libsvm對新版本的重新設定,改為如下命令即可:

[predicted_label, accuracy,decision_values]=svmpredict(teat_label,teat_data,model)

[predicted_label]=svmpredict(teat_label,teat_data,model)。

下面對model中的引數逐一說明:

>>  model.Parameters
ans =

         0
    2.0000
    3.0000
    0.0700
         0

model.Parameters引數意義從上到下依次為:
-s svm型別:SVM設定型別(預設0)
-t 核函式型別:核函式設定型別(預設2)
-d degree:核函式中的degree設定(針對多項式核函式)(預設3)
-g r(gama):核函式中的gamma函式設定(針對多項式/rbf/sigmoid核函式) (預設類別數目的倒數)
-r coef0:核函式中的coef0設定(針對多項式/sigmoid核函式)((預設0)

即在本例中通過model.Parameters我們可以得知 –s 引數為0;-t 引數為 2;-d 引數為3;-g 引數為0.07(這也是我們自己的輸入);-r 引數為0。

關於libsvm引數的一點小說明:Libsvm中引數設定可以按照SVM的型別和核函式所支援的引數進行任意組合,如果設定的引數在函式或SVM型別中沒有也不會產生影響,程式不會接受該引數;如果應有的引數設定不正確,引數將採用預設值。
model.Label         model.nr_class

 model.Label

ans =

     1

     0

>> model.nr_class

ans =

     2

model.Label表示資料集中類別的標籤都有什麼,這裡是 1,0;
model.nr_class表示資料集中有多少類別,這裡是二分類。

model.totalSV                model.nSV

>>  model.totalSV

ans =

    51

>> model.nSV

ans =

    25
    26

model.totalSV代表總共的支援向量的數目,這裡共有51個支援向量;
model.nSV表示每類樣本的支援向量的數目,這裡表示標籤為1的樣本的支援向量有25個,標籤為0的樣本的支援向量為26
注意:這裡model.nSV所代表的順序是和model.Label相對應的。

model.ProbA         model.ProbB

關於這兩個引數這裡不做介紹,使用-b引數時才能用到,用於概率估計。

model.sv_coef         model.SVs        model.rho

sv_coef: [51x1 double]
           SVs: [51x2 double]

model.rho =  0.7693

model.sv_coef是一個51*1的矩陣,承裝的是51個支援向量在決策函式中的係數

model.SVs是一個51*2的稀疏矩陣,承裝的是51個支援向量。

model.rho是決策函式中的常數項的相反數(-b)

在這裡首先我們看一下 通過 –s 0 引數(C-SVC模型)得到的最終的分類決策函式的表示式是怎樣的?

最終的決策函式為:

3.jpg

核函式採用預設的RBF故這裡的決策函式即為:

4.jpg

其中|| x-y ||是二範數距離 ;
這裡面的

b就是-model.rho(一個標量數字);
b = -model.rho;
n代表支援向量的個數即 n = model.totalSV(一個標量數字); 
對於每一個i:
wi =model.sv_coef(i); 支援向量的係數(一個標量數字)
xi = model.SVs(i,:) 支援向量(1*2的行向量)
x 是待預測標籤的樣本 (1*2的行向量)
gamma 就是 -g 引數

這是本人第一次寫部落格如果有什麼錯誤還請各位指正!本程式所用的資料及原始碼已經上傳下載地址(免積分):http://download.csdn.net/detail/xr1064/7437787點選開啟連結

對於機器學習的人在這裡推薦一個網站裡面有許多資料可供下載測試:http://archive.ics.uci.edu/ml/index.html點選開啟連結,這裡給出LIBSVM的使用答疑,絕大多數問題都可以在這裡找到答案:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#faq101點選開啟連結

此外本文也參考了其它網站的一些資料在這裡表示感謝並給出連結http://www.matlabsky.com/thread-12649-1-1.html點選開啟連結