LibSVM學習詳細說明——在Windows平臺運行流程

代碼文件主要針對Matlab進行說明,但個人仍覺得講解的支持向量機內容非常棒,可以做爲理解這一統計方法的輔助資料;

      LibSVM是臺灣林智仁(Chih-Jen Lin)教授2001年開發的一套支持向量機的庫,這套庫運算速度還是挺快的,可以很方便的對數據做分類或迴歸。由於libSVM程序小,運用靈活,輸入參數少,並且是開源的,易於擴展,因此成爲目前國內應用最多的SVM的庫。

這套庫可以從http://www.csie.ntu.edu.tw/~cjlin/免費獲得,目前已經發展到2.89版。下載.zip格式的版本,解壓後可以看到,主要有5個文件夾和一些c++源碼文件。

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

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也是很好的文件,對於初學者如果E文過得去,可以看一下。

下面以svm-train爲例,簡單的介紹下,怎麼編譯:(這步很簡單,也沒必要,對於僅僅使用libsvm庫的人來說,windows下的4個exe包已經足夠了,之所以加這步,是爲了那些做深入研究的人,可以按照自己的思路改變一下svm.cpp,然後編譯驗證)

我用的是VC 6.0,新建一個控制檯(win32 console application)程序,程序名叫svm-train(這個可以隨意),點擊OK後,選擇empty。

進入程序框架後,裏面什麼都沒有,然後找到你的程序目錄,把svm-train.c、svm.h和svm.cpp拷貝過去(.c文件是c語言的,要是你習慣了c++,你儘可以改成.cpp),然後把這3個文件添加到工程,編譯。。。如果沒錯誤,到debug下面看看,是不是有個svm-train.exe。其實windows下的svm-train.exe就是這樣編譯出來的。

哈哈,怎麼樣是不是很簡單。但是,這樣的程序直接運行沒意義,他要在dos下運行,接收參數才行。下面開始我們的libsvm的體驗之旅。

 

第一次體驗LibSvm

        1.把LibSVM包解壓到相應的目錄(因爲我只需要裏面windows文件夾中的東東,我們也可以只把windows文件夾拷到相應的目錄),比如D:/libsvm。

        2.在電腦“開始”的“運行”中輸入cmd,進入DOS環境。定位到d:/ libsvm下,具體命令如下:

              d: (回車)

            cd /libsvm/windows (回車)

              (上面第一行是先定位到盤符d,第二行cd是定位到相應盤符下的目錄)

        3.進行libsvm訓練,輸入命令:(這裏要注意文件的名字,2.89以前版本都是svmtrain.exe)

        svm-train heart_scale train.model

        heart_scale——是目錄下的已經存在的樣本文件,要換成自己的文件,只需改成自己的文件名就可以了

        train.model——是創建的結果文件,保存了訓練後的結果

可以看到結果:

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

      Total nSV = 132

其中,#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

 

到現在,第一次體驗libsvm到這就基本結束了,其他的兩個(svm-predict、svm-scale)的使用過程類似。怎麼樣,挺爽的吧。對於個別參數你還不理解,沒關係,下面我們會具體講到。

LibSvm使用規範:

其實,這部分寫也是多餘,google一下“libsvm使用”,就會N多的資源,但是,爲了讓你少費點心,在這裏就簡單的介紹一下,有不清楚的只有動動你的mouse了。需要說明的是,2.89版本以前,都是svmscale、svmtrain和svmpredict,最新的是svm-scale、svm-train和svm-predict,要是用不習慣,只需要把那四個exe文件名去掉中間的短橫線,改成svmscale、svmtrain和svmpredict就可以了,我們還是按原來函數名的講。

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 --線性核:u'*v

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

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

3 -- sigmoid核:tanh(γ*u'*v+coef0)

-d degree:設置多項式核中degree的值,默認爲3

-gγ:設置核函數中γ的值,默認爲1/k,k爲特徵(或者說是屬性)數;

-r coef 0:設置核函數中的coef 0,默認值爲0;

-c cost:設置C-SVC、ε-SVR、n - SVR中從懲罰係數C,默認值爲1;

-n v:設置v-SVC、one-class-SVM與n - SVR中參數n,默認值0.5;

-pε:設置v-SVR的損失函數中的e,默認值爲0.1;

-m cachesize:設置cache內存大小,以MB爲單位,默認值爲40;

-eε:設置終止準則中的可容忍偏差,默認值爲0.001;

-h shrinking:是否使用啓發式,可選值爲0或1,默認值爲1;

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

-wi weight:對各類樣本的懲罰係數C加權,默認值爲1;

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

model_file:可選項,爲要保存的結果文件,稱爲模型文件,以便在預測時使用。

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

svmtrain test.txt test.model

 

結果說明見LibSVM學習(二).

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的輸出文件,表示預測的結果值。

 

至此,主要的幾個接口已經講完了,滿足一般的應用不成問題。對於要做研究的,還需要深入到svm.cpp文件內部,看看都做了什麼。

 

 

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