
運用LIBSVM的分類與分群
元智大學資訊管理學系第二十屆專業實習報告
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


