LibSVM 安裝使用


知道這個庫已經很長的時間了,一直沒有實踐,以前也看過svm的理論,今天開始安裝一下一直感覺有錯誤,結果自己傻了,根本沒有錯,可以直接使用。。。

libsvm參考資料:

libsvm下載網址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 
我的系統環境為 Win7 64bit + Matlab R2014a ,下載的是最新版的libsvm-3.22

具體流程

  • 下載: 
    從libsvm的主頁下載合適的軟件安裝包,並解壓,比如我解壓到Matlab的Toolbox目錄下,具體路徑如下:....\Matlab\R2014b\toolbox
  • 設置Path: 
    在Matlab中依次選擇設置路徑-添加並包含子文件夾..,加入以上解壓后存放的路徑。
  • 編譯: 
    事實上,對於64位的系統,我們是不需要進行編譯的,自帶的軟件包中已經包含了對應於64位系統的編譯好的文件:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64,以上文件位於壓縮包'..\windows'文件夾中。對於非64位系統,或者需要自己編譯的特殊情況,采用如下de步驟編譯自己的二進制文件。 
    • 在matlab中切換到解壓后的libsvm-3.22\matlab目錄(如我的系統為:...\Matlab\R2014b\toolbox\libsvm-3.20\matlab
    • 在命令窗口輸入mex -setup ,此時會提示你選擇編譯器,就選擇一個已安裝的編譯器,如Microsoft Visual C++ 2013。之后Matlab會提示確認選擇的編譯器,輸入y進行確認。
    • 在命令窗口輸入make,等待make完成,生成相應的后綴為mexw64(64位系統)或mexw32(32位系統)的文件。
    • 這里要說明,其實前一步的mex -setup並不是必須的,在make指令不奏效的時候調用一下即可;另外,在我的配置過程中,會提示有問題,大致如下所示, 其實並不需要在意,直接調用make 也會成功編譯文件。

MEX 配置為使用 ‘Microsoft Visual C++ 2013 Professional (C)’ 以進行 C 語言編譯。 
警告…您需要更新代碼以利用新的 API。您可以在以下網址找到相關詳細信息…

先一直沒有看到類似的:

mex -setup
顯示

Please choose your compiler for building external interface (MEX) files: 
 
Would you like mex to locate installed compilers [y]/n?

輸入y
Select a compiler: 
[1] Lcc-win32 C 2.4.1 in D:\MATLAB\R2010a\sys\lcc 
[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0 
[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio 
 
以為沒有安裝上,沒有編譯通過,結果是可以用的。load數據也有問題,路徑不對:

有兩個數據集,一個是C++的, 一個是matlab的。libsvm庫中下載的是C++數據,

所以matlab加載我們下載的heart_scale是會報錯的:<這就是視頻中遺漏的小問題>

  • 重命名: 
    這並不是必須的操作,但鑒於個人的經驗,建議執行。 
    編譯完成后,在當前目錄下回出現svmtrain.mexw64、svmpredict.mexw64(64位系統)或者svmtrain.mexw32、svmpredict.mexw32(32位系統)這兩個文件,把文件名svmtrain和svmpredict相應改成libsvmtrain和libsvmpredict。 
    這是因為Matlab中自帶有SVM的工具箱,而且其函數名字就是svmtrain和svmpredict,和libsvm默認的名字一樣,在實際使用的時候有時會產生一定的問題,比如想調用libsvm的變成了調用Matlab SVM。 
    如果有進行重命名的,以后使用libsvm時一律使用libsvmtrain和libsvmpredict這兩個名字進行調用。

特別補充:

以上是普通的libsvm在matlab 2014b 的設置,起初對於我而言,也是並不需要編譯的,直接設置路徑就可以使用libsvm,但是由於我需要使用對樣本加權的訓練方法,於是經過搜索,發現他們也是提供libsvm-weights-3.20版本的,參見這里,其中提供了Matlab和Python的接口,而並不存在已經編譯好的文件,所以我需要進行編譯並使用這一帶權重的版本。

測試

以下測試是基於我配置的加權的libsvm的版本。 
libsvm軟件包下的heart_scaleheart_scale.wgt文件分別提供了樣本的label及feature信息和權重信息。要注意對於以上兩個文件,其讀取指令是不同的,以下將簡單演示:在matlab命令窗口執行如下命令:

[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale'); %讀取方法 heart_scale_weight = load('heart_scale.wgt'); model = libsvmtrain(heart_scale_weight, heart_scale_label, heart_scale_inst, '-c 1'); %改名字了吧 +lib [predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);

結果如下:

*
optimization finished, #iter = 166 obj = -107.553365, rho = 0.449867 nSV = 131, nBSV = 103 Total nSV = 131 Accuracy = 86.2963% (233/270) (classification)

特別的,對於不需要對樣本考慮權重的情況,只需要修改訓練的指令為:

model = libsvmtrain([], heart_scale_label, heart_scale_inst, '-c 1');

ok,以上就是對於Matlab 2014a使用libsvm(libsvm-weights)的簡要記錄。

 

svmtrain函數相關參數說明

svmtrain函數返回的model可以用來對測試數據集進行預測。這是一個結構體變量,主要包括了以下幾個域。[Parameters, nr_class, totalSV, rho, Label, ProbA, ProbB, nSV,sv_coef, SVs]。英文說明如下:

       -Parameters: parameters

       -nr_class: number of classes; = 2 for regression/one-class svm

       -totalSV: total #SV

       -rho: -b of the decision function(s) wx+b

       -Label: label of each class; empty for regression/one-class SVM

       -ProbA: pairwise probability information; empty if -b 0 or in one-classSVM

       -ProbB: pairwise probability information; empty if -b 0 or in one-classSVM

       -nSV: number of SVs for each class; empty for regression/one-class SVM

       -sv_coef: coefficients for SVs in decision functions

       -SVs: support vectors

如果沒有指定’-b 1’選項則ProbA和ProbB為空矩陣。此外,當指定’-v’選項時,返回的model是一個數值,是cross-validation的准確率。

其中model.paramter是一個5X1的向量,參數意義為:

model.Parameters參數意義從上到下依次為:

-s svm類型:SVM設置類型(默認0)

-t 核函數類型:核函數設置類型(默認2)

-d degree:核函數中的degree設置(針對多項式核函數)(默認3)

-g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數)

-r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)

svmpredict函數參數說明

svmpredict函數返回三個值,predict_label,是訓練集預測得到的label向量。第二個輸出是accuracy,是一個3維的向量,從上到下分別是:分類准率(分類問題中用到的參數指標);平均平方誤差(MSE (mean squared error))(回歸問題中用到的參數指標);平方相關系數(r2 (squared correlation coefficient))(回歸問題中用到的參數指標)。第三個輸出是個矩陣,包含着決策值或者是概率估計(當’-b 1’被指定時)。當訓練數據有k類時,決策值矩陣是一個n行k*(k-1)/2列的矩陣(n為測試數據集個數,k為類別數),而每一行的輸出是k*(k-1)/2個二分類器的結果。當’-b 1’被指定時,概率估計矩陣是一個n行k類的矩陣(n為測試數據集個數,k為類別數),每一行的輸出是該測試數據屬於每個類的概率。

先試着學習,孰能生巧。。。

 

特別感謝:Matlab配置libsvm

              SVM學習筆記(1)LIBSVM在matlab下的使用安裝

              LibSVM 在matlab中的使用

              LibSVM 在matlab中的配置(包括SVDD、libsvm-faruto)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM