天天看點

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”,接着,用滑鼠左鍵在視窗右下方随便點選幾下,代表你選擇的第二類模式的資料分布,如下圖所示:

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

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

繼續閱讀