小白寫給小白們的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的傻妞,希望你能一切順利。