1. 程式人生 > >小白寫給小白們的MATLAB libsvm 安裝和使用

小白寫給小白們的MATLAB libsvm 安裝和使用

最近在學習SVM,在matlab上安裝和使用Libsvm的過程中遇到了好多問題,在網上查看了許多資料,踩了許多坑。

整理一下供大家分享,希望能節省大家在安裝過程中的時間。

一、安裝

1.libsvm 下載

本人使用windows 10-64bits, Matlab 2016a,還下載了VS2017(這個稍後再說),下載最新版Libsvm 3.23,地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/。將zip檔案解壓到matlab/toolbox/(其他位置也可,但在使用時一定要將matlab路徑調至該軟體包處),如圖。其中有java,matlab和python 三種版本,以及測試資料集heart_scale,和readme說明檔案(內有Libsvm的引數說明,建議閱讀,其中例子是在windows 命令列視窗執行的。)                                                    

2.設定路徑

在matlab中設定路徑

3.編譯 

不要問我為啥要編譯,我也是小白,在該步驟遇到了許多麻煩,給大家分享一下。

先來說一下編譯步驟,在matlab命令列中輸入mex -setup -v 檢視一下電腦中有啥編譯器

若是能找到c++編譯器,可直接嘗試在命令列視窗輸入make進行編譯,完成後出現4個字尾為.mexw64檔案

在最後終於找到了幾個是,使用的是TDM-GCC-64編譯器,這個是我額外下的。大家往上看Visual C++的編譯的編譯器只能找到2015,下了VS2017的我一臉懵逼。找了好多資料,說是matlab版本低了,行,大哥,被迫我又下了個matlab 2017b,嘿嘿,能出現C++2017的字了,但後面括號裡還是否(一萬隻草泥馬奔騰)。繼續查資料,說是如果先裝matlab,再裝VS,可能是由於沒配置環境的情況,會找不到編譯器。想了想,我這不是後裝了個新版本嗎? 看見貼吧裡有大佬說正版的Matlab沒毛病(額,窮孩子也想學點習),破解版的需要做一系列操作(計算機小白表示看不懂)。

4. 測試

按照網上最常見的測試方法,來進行一下測試。

將Libsvm檔案下的測試資料集heart_scale複製到Libsvm\matlab下,後續的操作將在該資料夾下進行,同時將MATLAB工作路徑轉至該檔案下(在MATLAB中也可完成檔案的複製貼上工作)。

在命令列視窗輸入

[heart_scale_label,heart_scale_inst]=libsvmread('heart_scale');

model = svmtrain(heart_scale_label,heart_scale_inst) ;

[predict_label,accuracy,dec_values] = svmpredict(heart_scale_label,heart_scale_inst,model);(該行程式碼也可以只有一個輸出值predict_label,看到過一個測試教程裡給了雙輸出值的模式,愣是跑不出來,最後在Libsvm\matlab\README中看見了格式,在此希望新手們仔細閱讀Libsvm\README 和Libsvm\matlab\README,前者介紹svm的命令,後者介紹matlab下的語句規範)

5. 檔案格式準備 

• Test We propose that beginners try the following procedure first:  (我們建議新手嘗試如下步驟)

• Transform data to the format of an SVM package                           (轉換資料至SVM格式)

• Conduct simple scaling on the data                                                   (執行資料歸一化)

• Consider the RBF kernel K(x, y) = e −γkx−yk 2                                    (考慮徑向基核函式)

• Use cross-validation to find the best parameter C and γ                          (使用交叉檢驗找到最優的引數C和γ)

• Use the best parameter C and γ to train the whole training set5                 (使用最優的引數進行整個資料集的訓練)

• Test                                                                                                                (測試)

5.1 標準格式轉換

做為新手的我決定老實按照指導來,然後就發現了問題,轉換格式是什麼鬼?又找了一波資料,發現我們需要FormatDataLibsvm.xls 這麼一個表格。在百度上搜了一下,好多博主上傳的資料都要5個c幣,做為無產階級的我表示扛不住。

輸入簡單的資料,如圖:

注意:使用該表格時需要執行巨集(我也不知道是啥東西),輸入資料時最後一列為標籤,轉換完成後,標籤轉至第一列。本人使用word office 2013 ,在WPS時出現了不可預知的錯誤,一臉懵逼,幸好我倆個都有,將表格另存為txt格式文字(excel另存為有倆種txt格式,unicode文字和文字檔案(製表格分割)皆可)。

5.2 資料歸一化

可以看見在libsvm-3.23\windows資料夾有一個svm-scale.exe 的執行程式,經測試該exe檔案雙擊無法使用。

該應用程式需要在windows cmd 裡執行(按住windows+r,輸入cmd即可)。

將轉換好的txt文字複製到該目錄,將cmd里路徑調至該資料夾(可將資料夾直接拖入cmd,手動輸太xxx的長了)。

 

以a.txt為例,執行完成後,會在該檔案目錄下生成歸一化的a1.txt檔案,預設歸一化範圍(-1,1),詳情可參考README文件,以下是歸一化完成的文字和初始文字對比。

5.3 訓練以及預測

將歸一化好的a1.txt檔案複製到libsvm-3.23\matlab 目錄下(原諒我一次又一次的複製貼上,一切為了穩,穩,穩)。

[lable,im]=libsvmread('a1.txt');                              %讀取檔案 model=svmtrain(lable(1:300),im(1:300,:),'-s 4 -t 2 -c 1 -g 0.125');          %訓練 [prelabel,accuracy,decision_values]=svmpredict(lable(301:600),im(301:600,:),model);                 %預測

 

至此,所有的流程結束,剩下的就是引數尋優的過程。

最後:

以此文獻給正在學習SVM的傻妞,希望你能一切順利。