svm理論與實驗之11:svm開發工具包LibSVM

svm理論與實驗之11:svm開發工具包LibSVM
徐海蛟博士 Teaching.


光說不練,很難真正理解svm的妙處,也難以真正實用。所以,有必要跟着徐海蛟老師一起練習svm。svm理論和工具已經很成熟了。童鞋們並不需要手寫每一行代碼。一個非常好用的開發工具包是LibSVM,支持C++、Java、Matlab語言。libSVM只是衆多SVM實現版本中的其中之一。


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


這套庫可以從官網免費獲得,目前已經發展到3.17版(2013年4月)。Libsvm ReadMe中文說明文件在。下載.zip格式的版本,解壓後可以看到,主要有6個文件夾和一些c++源碼文件。


       Java    —— 主要是應用於java平臺;
  Matlab  —— 主要是應用於matlab平臺;
       Python  —— 是用來參數優選的工具,稍後介紹;
       svm-toy —— 一個可視化的工具,用來展示訓練數據和分類界面,裏面是源碼,其編譯後的程序在windows文件夾下;
       tools   —— 主要包含四個python文件,用來數據集抽樣(subset),參數優選(grid),集成測試(easy), 數據檢查(checkdata);
       windows —— 包含libSVM四個exe程序(svm-scale,svm-toy,svm-train,svm-predict)。


  svm-scale:一個用於對輸入數據進行歸一化的簡易工具;
  svm-toy:一個帶有圖形界面的交互式SVM二分類功能演示小工具;
  svm-train:對用戶輸入的數據進行SVM訓練。其中,訓練數據是按照以下格式輸入的:
<類別號> <索引1>:<特徵值1> <索引2>:<特徵值2>...
  svm-predict:根據SVM訓練得到的模型,對輸入數據進行預測,即分類。


在目錄libsvm-3.17\下,還有heart_scale,是一個樣本文件,包含270個正反例樣本點,可以用記事本打開,用來測試用的。


其他.h和.cpp文件都是程序的源碼,可以編譯出相應的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(還有一個svm-toy.c在svm-toy\windows\文件夾中)都是調用的這個文件中的接口函數,編譯後就是windows\下相應的四個exe程序。

另外,裏面的 README 跟 FAQ 也是很好的文件,對於初學者如果E文過得去,可以看一下。PS:《libsvm最新ReadMe中文檔New2013》在csdn裏面有下載。


下面以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的體驗之旅。


類似地,如果是使用Java版本的Libsvm,在myeclipse裏面很快搞定。


windows\的子文件夾,裏面有一個名爲svm-toy.exe的可執行文件,這個小玩意兒是比較直觀地感受下svm的分類效果,它是一個帶有圖形界面的交互式SVM二分類功能演示小工具。直接雙擊,運行該可執行文件。


點擊第二個按鈕“Run”,然後,在左上部分,用鼠標左鍵隨機點幾下,代表你選擇的第一類模式的數據分佈。


之後,點擊“Change”,接着,用鼠標左鍵在窗口右下方隨便點擊幾下,代表你選擇的第二類模式的數據分佈,如下圖所示:


接着,點擊“Run”,libSVM就幫你把這兩類模式分開了,並用兩種不同的顏色區域來代表兩類不同的模式,如下圖所示:


圖中左上方色的區域,是第一類模式所在的區域,右下方的區域,是你選擇的第二類模式所在的的區域,而兩者的分界面,也就是SVM的最優分類面。當然,SVM是通過核函數將原始數據映射到高維空間,在高維空間進行線性分類。換句話說,在高維空間,這兩類數據應該是線性可分的,即:最優分類面應該是一條直線,而這裏看到的,是將高維空間分類的結果又映射回原始空間所呈現的分類結果,即:非線性的分類面。

細心的朋友可能已經發現,在上述界面的右下角,有一個編輯框,裏面寫着“-t 2 -c 100”,顯然,這是libSVM的一些參數: 徑向基核函數,懲罰因子100,你也可以試着更改這些參數,來選擇不同的核函數、不同的SVM類型等來達到最好的分類效果。


發佈了8 篇原創文章 · 獲贊 18 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章