top of page

libsvm的介紹

libsvm

 

Libsvm的介紹

 

LIBSVM是臺灣大學林智仁(Lin Chih-Jen)教授等2001年開發設計的一個簡單, 易於使用和快速有效的SVM模式識別與回歸的軟體包, 他不但提供了編譯好的可在Windows系列系統的執行檔, 還提供了源代碼, 方便改進, 修改以及在其他操作系統上應用; 該軟體對SVM所涉及的參數調節相對比較少, 提供了很多的默認參數, 利用這些默認參數可以解決很多問題; 並提供了交互檢驗(Cross Validation)的功能. 該軟體包可在http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.htm 免費獲得. 該軟體可以解決C-SVM, ν-SVM, ε-SVR和ν-SVR等問題, 包括基於一對一演算法的多類模式識別問題.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Java: 主要是應用於java平臺;

matlab: windows下64位matlab平臺;

python: 是用來參數優選的工具, 稍後介紹;

svm-toy: 一個可視化的工具, 用來展示訓練數據和分類介面, 裏面是源碼, 其編譯後的程式在windows檔夾下;

tools: 主要包含四個python檔, 用來數據集抽樣(subset), 參數優選(grid), 集成測試(easy), 數據檢查(checkdata);

windows: 包含libSVM四個exe程式包, 我們所用的庫就是他們.

檔夾裏面還有個heart_scale, 是一個樣本檔, 可以用記事本打開, 用來測試用的.

其他.h和.cpp檔都是程式的源碼, 可以編譯出相應的.exe檔. 其中, 最重要的是svm.h和svm.cpp檔, svm-predict.c, svm-scale.c和svm-train.c(還有一個svm-toy.c在svm-toy檔夾中)都是調用的這個檔中的介面函數, 編譯後就是windows下相應的四個exe程式. 另外, 裏面的README跟FAQ也是很好的檔, 對於初學者如果W文較好的話, 可以看一下.

對於僅僅使用libsvm庫的人來說, windows下的4個exe包已經足夠了, 如果是為了做深入研究, 可以按照自己的思路檔夾中的.cpp和.c檔, 然後編譯驗證)

 

 

libsvm教程:

1:測試libsvm工具包

1). 把LibSVM包解壓到相應的目錄(因為我只需要裏面windows檔夾中的exe程式包, 我們也可以只把windows檔夾拷到相應的目錄), 比如C:\jacoxu\test\libsvm-3.12

2). 在電腦”開始”的”運行”中輸入cmd, 進入DOS環境. 定位到C:\jacoxu\test\libsvm-3.12下, 具體命令如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 3). 進行libsvm訓練, 輸入命令:

svm-train ../heart_scale train.model

heart_scale: 是目錄下的已經存在的樣本檔, 要換成自己的檔, 只需改成自己的檔案名就可以了;

train.model: 是創建的結果檔, 保存了訓練後的結果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

其中, #iter 為迭代次數;

nu 是選擇的核函數類型的參數;

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

rho 為判決函數的偏置項b;

nSV 為標準支持向量個數(0<a[i]<c);

nBSV 為邊界上的支持向量個數(a[i]=c);

Total nSV為支持向量總個數(對於兩類來說, 因為只有一個分類模型Total nSV = nSV

但是對於多類, 這個是各個分類模型的nSV之和).

在目錄下, 還可以看到產生了一個train.model檔, 可以用記事本打開, 記錄了訓練後的結果.

svm_type c_svc             //所選擇的svm類型, 默認為c_svc   

kernel_type rbf             //訓練採用的核函數類型, 此處為RBF核   

gamma 0.0769231          //RBF核的參數γ   

nr_class 2                 //類別數, 此處為兩分類問題   

total_sv 132               //支持向量總個數   

rho 0.424462              //判決函數的偏置項b   

label 1 -1                 //原始檔中的類別標識   

nr_sv 64 68               //每個類的支持向量機的個數   

SV                     //以下為各個類的權係數及相應的支持向量   

1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1   

0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5   

   ………   

-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1   

-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5  

 

這裏注意, 第二行出現的權係數為小數(0.5104832128985164)是因為這個點屬於非邊界上的支持向量, 即: (0<a[i]<c).

其他的兩個(svm-predict, svm-scale)的使用過程類似.

2: libsvm使用規範

1). libSVM的數據格式

Label 1: value 2:value ….

Label: 是類別的標識, 比如上節train.model中提到的1 -1, 你可以自己隨意定, 比如-10, 0, 15. 當然, 如果是回歸, 這是目標值, 就要實事求是了.

Value: 就是要訓練的數據, 從分類的角度來說就是特徵值, 數據之間用空格隔開.

比如: -15 1:0.708 2:1056 3:-0.3333

需要注意的是, 如果特徵值為0, 特徵冒號前面的(姑且稱做序號)可以不連續. 如:

-15 1:0.708 3:-0.3333

表明第2個特徵值為0, 從編程的角度來說, 這樣做可以減少記憶體的使用, 並提高做矩陣內積時的運算速度. 我們平時在matlab中產生的數據都是沒有序號的常規矩陣, 所以為了方便最好編一個程式進行轉化.

2). svmscale的用法

svmscale是用來對原始樣本進行縮放的, 範圍可以自己定, 一般是[0,1]或[-1,1]. 縮放的目的主要是

1) 防止某個特徵過大或過小, 從而在訓練中起的作用不平衡;

2) 為了計算速度. 因為在核計算中, 會用到內積運算或exp運算, 不平衡的數據可能造成計算困難.

用法: svmscale [-l lower] [-u upper]

              [-y y_lower y_upper]

              [-s save_filename]

              [-r restore_filename] filename

其中, []中都是可選項:

         -l: 設定數據下限; lower: 設定的數據下限值, 缺省為-1

         -u: 設定數據上限; upper: 設定的數據上限值, 缺省為1

         -y: 是否對目標值同時進行縮放; y_lower為下限值, y_upper為上限值;

         -s save_filename: 表示將縮放的規則保存為檔save_filename;

         -r restore_filename: 表示將按照已經存在的規則檔restore_filename進行縮放;

         filename: 待縮放的數據檔, 檔格式按照libsvm格式.

默認情況下, 只需要輸入要縮放的檔案名就可以了: 比如(已經存在的檔為test.txt)

         svmscale test.txt

這時, test.txt中的數據已經變成[-1,1]之間的數據了. 但是, 這樣原來的數據就被覆蓋了, 為了讓規劃好的數據另存為其他的檔, 我們用一dos的重定向符>來另存為(假設為out.txt):

         svmscale test.txt > out.txt

運行後, 我們就可以看到目錄下多了一個out.txt檔, 那就是規範後的數據. 假如, 我們想設定數據範圍[0,1], 並把規則保存為test.range檔:

         svmscale –l 0 –u 1 –s test.range test.txt > out.txt

這時, 目錄下又多了一個test.range檔, 可以用記事本打開, 下次就可以用-r test.range來載入了.

3). svmtrain的用法

svmtrain我們在前面已經接觸過, 他主要實現對訓練數據集的訓練, 並可以獲得SVM模型.

用法: svmtrain [options] training_set_file [model_file]

其中, options為操作參數, 可用的選項即表示的涵義如下所示:

-s 設置svm類型:

         0 – C-SVC

         1 – v-SVC

         2 – one-class-SVM

         3 – ε-SVR

         4 – n – SVR

-t 設置核函數類型, 默認值為2

         0 — 線性核: μ‘∗ν

         1 — 多項式核:    (γ∗μ‘∗ν+coef0)degree

         2 — RBF核: exp(–γ∗∥μ−ν∥2)

         3 — sigmoid 核: tanh(γ∗μ‘∗ν+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;

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

model_file: 可選項, 為要保存的結果檔, 稱為模型檔, 以便在預測時使用.

其中-g選項中的k是指輸入數據中的屬性數. option -v 隨機地將數據剖分為n部分並計算交互檢驗準確度和均方根誤差. 以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合, 如果設置的參數在函數或SVM類型中沒有也不會產生影響, 程式不會接受該參數; 如果應有的參數設置不正確, 參數將採用默認值.

training_set_file是要進行訓練的數據集; model_file是訓練結束後產生的模型檔, 檔中包括支持向量樣本數, 支持向量樣本以及lagrange係數等必須的參數; 該參數如果不設置將採用默認的檔案名, 也可以設置成自己慣用的檔案名.

默認情況下, 只需要給函數提供一個樣本檔案名就可以了, 但為了能保存結果, 還是要提供一個結果檔案名, 比如: test.model, 則命令為:

    svmtrain test.txt test.model

4). svmpredict 的用法

svmpredict 是根據訓練獲得的模型, 對數據集合進行預測.

用法: svmpredict [options] test_file model_file output_file

其中, options為操作參數, 可用的選項即表示的涵義如下所示:

-b probability_estimates: 是否需要進行概率估計預測, 可選值為0 或者1, 默認值為0.

model_file: 是由svmtrain 產生的模型檔;

test_file: 是要進行預測的數據檔, 格式也要符合libsvm格式, 即使不知道label的值, 也要任意填一個, svmpredict會在output_file中給出正確的label結果, 如果知道label的值, 就會輸出正確率;

output_file: 是svmpredict 的輸出檔, 表示預測的結果值。

 

 

參考資料的來源:

http://www.cnblogs.com/bourneli/archive/2013/03/11/2954060.html

http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html

 

bottom of page