1. 程式人生 > >libsvm支援向量機工具箱在MATLAB中的安裝與使用

libsvm支援向量機工具箱在MATLAB中的安裝與使用

這幾天幫別人做一個關於svm分類的東西,由於是多類多特徵的分類,發現徒手寫對於我這樣的菜鳥來說太難了,網上也沒有相關的資料,但是最後發現了LIBSVM這個工具箱,是由臺灣大學林智仁(Lin Chih-Jen)教授等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟體包,他不但提供了編譯好的可在Windows系列系統的執行檔案,還提供了原始碼,方便改進、修改以及在其它作業系統上應用;該軟體對SVM所涉及的引數調節相對比較少,提供了很多的預設引數,利用這些預設引數可以解決很多問題;並提供了互動檢驗(Cross Validation)的功能。該軟體可以解決C-SVM、ν-SVM、ε-SVR和ν-SVR等問題,包括基於一對一演算法的多類模式識別問題。

目前,LIBSVM擁有C、Java、Matlab、C#、Ruby、Python、R、Perl、Common LISP、Labview、php等數十種語言版本。最常使用的是C、Matlab、Java和命令列(c語言編譯的工具)的版本。

關於這個工具箱的安裝方法,我參考了兩篇網友的部落格,對我幫助很大,我當時出現的情況是第二個網友出現的情況,而常規的是第一個網友的情況(你可以先從第一個網友的看,出現什麼情況後再看第二個網友的,前提是matlab沒有出報錯),我在轉的這兩篇部落格某些地方會有點小更改,不過不會有什麼影響:

第一個網友部落格:http://blog.csdn.net/loadstar_kun/article/details/7712308

第二個網友部落格:http://m.blog.csdn.net/article/details?id=51331299

第一個網友部落格:

一.下載libsvm

libsvm的網站上下載 libsvm-3.22.zip檔案,解壓後放在任意目錄下,最好放在MATLAB工具箱中,比如 D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22下。

二.配置編譯器

開啟 matlab,將工作目錄切換到D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22\matlab目錄下,在命令列鍵入以下命令:

mex –setup

出現提示語句

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n?n %這次是選擇編譯器,輸入n,選擇自定義的編譯器

出現以下選項(因電腦而異,!!!!!! 注意 !!!!!!如果輸入 mex -setup後出現 MEX 配置為使用 ‘Microsoft Visual C++ 2012 (C)’ 以進行 C 語言編譯。 警告: MATLAB C 和 Fortran API 已更改,現可支援包含 2^32-1 個以上元素的 MATLAB 變數。不久以後,您需要更新程式碼以利用新的 API。您可以在以下網址找到相關詳細資訊:等等的話,那麼這個時候你就要參考我轉的這兩篇部落格的第二個網友的部落格了)

Select a compiler:

[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)

[4] Lcc-win32 C 2.4.1

[5] Microsoft Visual C++ 6.0

[6] Microsoft Visual C++ 2005 SP1

[7] Microsoft Visual C++ 2008 SP1

[8] Microsoft Visual C++ 2010

[9] Microsoft Visual C++ 2010 Express

[10] Open WATCOM C++

[0] None

Compiler: 8%可以用其他的,出現以下提示語句

Your machine has a Microsoft Visual C++ 2010 compiler located at

C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?

編譯器預設路徑,確認正確輸入y,更改路徑,輸入n

輸入y出現再次確認

Please verify your choices:

Compiler: Microsoft Visual C++ 2010 

Location: C:\Program Files\Microsoft Visual Studio 10.0

Are these correct [y]/n? y

編譯器配置完成

Trying to update options file: C:\Documents and Settings\zhangduokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat

From template:              C:\PROGRA~1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat

Done …

三.編譯

輸入命令

>> make

>> 

%編譯完成

系統就會生成svmtrain.mexw32svmpredict.mexw32libsvmread.mexw32libsvmwrite.mexw32等檔案(對於 Matlab 7.1以下上版本,生成的對應檔案為svmtrain.dllsvmpredict.dll read_sparse.dll,沒做測試),然後可以在matlab的選單 File->Set Path->add with subfolders(可直接用Add Folder)裡,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目錄新增進去,這樣以後在任何目錄下都可以呼叫 libsvm的函數了。

四.測試

為了檢驗 libsvm matlab之間的介面是否已經配置完成,可以在 matlab下執行以下命令:

>>load heart_scale

完成該步驟後發現Workspace中出現了heart_scale_inst heart_scale_label,說明正確

>>model = svmtrain(heart_scale_label, heart_scale_inst, ‘-c 1 -g 0.07’);

>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model); %

Accuracy = 86.6667% (234/270) (classification)%  done

如果執行正常並生成了model這個結構體(其中儲存了所有的支援向量及其係數),那麼說明 libsvmmatlab 之間的介面已經完全配置成功。

注意:

1. matlab自帶了C編譯器Lcc-win32C,但是libsvm原始版本是C++實現的,因此需要C++的編譯器來編譯,這就是不適用matlab預設編譯器而選擇其他C++編譯器的原因。

matlab支援的編譯器也是有限的,可以檢視不同版本matlab支援的編譯器列表

2. 如果matlab版本太低,如matlab 7.0是不能用VS作為編譯器的,只能用VC++ 6.0

3. .mexw32 檔案是經過加密的,開啟是亂碼,函式本身沒有幫助。

例如輸入 help svmpredict會出現報錯: svmpredict not found

工具箱libsvm-3.12\matlabREADME檔案才是幫助檔案。

但是輸入help svmtrain會出現幫助資訊,其實出現的是系統自帶的svmtrain函式,沒有libsvm工具箱中的好用。

4.在新版本libsvm3.12中,資料夾libsvm-3.12\windows中已經有編譯好的程式,可以直接使用,只需要把libsvm-3.12\windows新增到matlab路徑中即可,不需要編譯的過程。當然最好還是自己編譯一遍,因為編譯環境不同會導致一些不可預估的小問題,自己編譯的過程是可控的。

5. 測試用資料集,libsvm官網上提供了很多資料集

測試使用的heart_scale資料集是C++版本的(類標籤 1:第一個屬性 2:第二個屬性),可以用libsvmread來轉換為matlab版本的(它們的區別在類標籤)。

[label_vector, instance_matrix] = libsvmread(‘C++版本資料集’); %得到類標籤和屬性矩陣,然後可以使用它們訓練了model = svmtrain(label_vector, instance_matrix);

>> load heart_scale

>> model = svmtrain(heart_scale_label,heart_scale_inst); 

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

>> [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);

Accuracy = 86.6667% (234/270) (classification)

6.參考資料

libsvm庫下載:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

視訊:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小問題,等下會提到)

詳解:http://www.matlabsky.com/thread-11925-1-1.html