天天看點

初試LIBSVM

在做Kinect手勢識别項目的時候用到了SVM這個東西。原理上不甚了解,但是用起來感覺還是很神奇的。

度娘百科:支援向量機SVM(Support Vector Machine)作為一種可訓練的機器學習方法。

具體實施時,歸納一下大概是下面這幾個步驟:

1. 獲得樣本資料,按SVM訓練函數的傳入參數格式要求,進行整理;
2. 利用訓練函數train,根據樣本進行訓練,獲得預測模型model;
3. 利用預測函數predict和模型model,對測試資料進行預測,取得結果;
           

當然了SVM的整個一套系統我們不用自己寫,可以直接拿開源的來用。台灣大學的林智仁教授弄的這個LIBSVM效果是相當好的!他提供了MatLab和Java兩種形式的封裝。但是我們的項目是用C#寫的,是以為了友善就用了一個C#封裝版的。版本不是很新但是夠用就行。作者是袋鼠國Andrew Poh,在林智仁教授的LIBSVM上也提供了其他各種語言封裝的LIBSVM。

不過這個C#封裝版的LIBSVM的源碼,看起來有些不夠“面向對象”(當然深受“u can u up no can no bb”思想毒害的我是不會繼續吐槽的。能封裝而且用起來穩定,這就很好了)。

扯了這麼多我想說LIBSVM在調用的時候最值得注意的部分就是樣本資料的格式(同理測試資料的的格式也同樣重要),這個讓我一開始蛋疼了很久而且一度找不到辦法。後來發現LIBSVM的官網上居然就有範例……雖然不針對C#封裝版,但隻要源碼一樣,調用參數的格式就應該差别不大對吧(想當然,但值得一試)。

樣本資料這樣寫:

<類别1> <空格> <1:><資料> <空格> <2:><資料> <空格> <3:><資料> ……
<類别1> <空格> <1:><資料> <空格> <2:><資料> <空格> <3:><資料> ……
<類别2> <空格> <1:><資料> <空格> <2:><資料> <空格> <3:><資料> ……
……
           

類别隻能是整數。建議取0、1、2、3……因為建立string數組存放類别名的時候,從0開始的整數剛好可以作為數組索引。

資料必須用科學計數法表示。保留小數點後6位,比如0.1要寫成:

0.010000e+01   或   0.010000e+001
           

e+後面不能是00

測試資料用同樣的格式寫。最終由predict函數傳回的結果是這樣的:

<STX(ASCII裡面的一個值)><測試資料1結果的類别>
<STX(ASCII裡面的一個值)><測試資料2結果的類别>
<STX(ASCII裡面的一個值)><測試資料3結果的類别>
……
           

就是這樣。注意以上都用由Andrew Poh編寫C#封裝版的LIVSVM得到的測試結果。

繼續閱讀