1. 程式人生 > >記錄在學習ML過程中,在MATLAB中集成LibSVM時遇到的問題

記錄在學習ML過程中,在MATLAB中集成LibSVM時遇到的問題

matlab     libsvm   mingw64(gcc)  

前幾天寫了一下自己對SVM中關鍵的距離問題的理解,後面會繼續記錄自己對該模型其他問題的理解,今天想試試SVM在“西瓜書”那個“阿爾法3.0”數據集上的效果。於是查到了“灣灣”教授林智仁先生大牛等寫的一個開源包LibSVM,並且該library可以與很多平臺兼容,有很多語言版本,支持java 、C++、C 、MATLAB等,我們可以在林教授主頁上下載。LibSVM地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,Windows平臺下載Zip壓縮文件,Linux下則是tar.gz,新版的包為3.x。本人MATLAB開發平臺的版本號為Windows下的R2016a,因此,記錄R2016a集成該開源包的過程。

首先,我搜到了faruto大佬在matlabsky發的一個關於該問題的帖子,於是就按照該帖子的敘述進行相關的操作,不過踩到了好幾個坑,因為這個帖子是好久之前的,版本比較靠前,所以會有些細節上的不同,不過大致還是可以參考的。而且也有視頻的講解可以參考。

原貼地址:http://www.matlabsky.com/thread-11925-1-1.html

優酷視頻:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html

Step1:添加LibSVM的搜索目錄(路徑)

點擊主頁選項卡下的“設置路徑”按鈕---->點擊“添加並包含子文件夾”---->點擊“libsvm-3.22”文件夾,選擇所在的目錄 ---->保存&關閉

Step2:安裝C++編譯器

帖子中先是運行mex -setup,按照提示進行選擇,但是我在安裝了VC6.0的前後,運行該命令都會報錯:“未安裝編譯器或者SDK”,也就是安裝了VC也找不到,我猜測可能是VC太舊。所以換了GCC, 由於開發包是C++開發的,所以需要相關的編譯器進行編譯後,MATLAB才能夠調用。由於新版本的MATLAB支持MinGW(GCC)編譯器,而且相對比較小巧,故我選擇了安裝該編譯器(也可以安裝VS201X),安裝路徑最好是“X:\TDM-GCC-64”這種形式,“X”是盤符下載地址:http://tdm-gcc.tdragon.net/download,或者下載網盤數據,鏈接

:http://pan.baidu.com/s/1cMwao2 密碼:xh9u 。安裝完成後再運行命令“mex -setup”,依然提示錯誤,該問題可能是GCC的path設置有問題,選擇調用setenv(‘MW_MINGW64_LOC‘,folder)函數進行設置,其中folder為GCC的路徑,例如:setenv(‘MW_MINGW64_LOC‘,‘D:\TDM-GCC-64‘) ;運行該命令後再mex -setup ,OK,可以!

Step3:make.m編譯相關的C++文件(主要是train和predict源文件)

緊隨Step2,選擇當前目錄為Libsvm,然後運行make腳本(當前目錄設置為Libsvm是防止MATLAB中有與make同名的腳本),本以為已經成功集成,誰料依然出錯“No such file or directory......”,實在是有一種fuck dog的感覺,繼續填坑,查閱其他博客,幸好有人遇到過同樣的問題,make腳本文件中將配置MATLAB對應的代碼行進行修改,具體將“CFLAGS”修改為“COMPFLAGS”可以用ctr+F然後點擊全部替換可以更快。完成以上操作之後,再運行make腳本函數,成功運行,在當前文件夾(../Libsvm/matlab)中,會發現多了兩個train和predict的.obj文件這是編譯之後的結果,表示成功。

Step4:測試libsvm環境

在libsvm2.x中,是有heart_scale.mat數據文件但是最新的libsvm3.x只有heart_scale純文本文件,這是C++數據數據文件的格式,如果按照faruto視頻中的操作,鍵入“load heart_scale”命令,會發現,結果出錯,這是由於缺少對應的MATLAB的數據格式的文件,因此需要用libsvmread命令進行讀入,該命令其實是運行一個lib中的libsvmread.c的C文件,用於對數據的轉換,其調用格式為libsvmread(‘filename’) ;例如[label_vector, instance_matrix] = libsvmread(‘heart_scale‘);此處用的當前路徑,不知道可不可以用絕對路徑,可以試試,應該是可以的。數據經過轉換後,可以發現,多了兩個數據,label_vector和instance,分別是樣本標簽和屬性,有了數據,下面就對環境進行正式測試。調用model = svmtrain(label_vector, instance_matrix) ;生成訓練模型後在調用svmpredict(label_vector, instance_matrix, model, ‘q‘),得到結果。我用周教授《機器學習》上的西瓜數據集α3.0進行環境測試,得到結果如圖所示:

技術分享

雖然結果很差,但是環境是搭建好了的,測試成功,因為我並沒有分訓練集和測試集,而且數據只有18條左右,所以這結果沒啥意義,我就只是單純測試環境是否搭建好,僅此而已。

本文出自 “code changes life” 博客,請務必保留此出處http://spencergra.blog.51cto.com/9609512/1959161

記錄在學習ML過程中,在MATLAB中集成LibSVM時遇到的問題