《量化投資:以MATLAB為工具》

MATLAB技術論壇

 找回密碼
 注冊賬號
查看: 198549|回復: 461
打印 上一主題 下一主題
收起左側

[教程] libsvm-mat在MATLAB平臺下的安裝

    [復制鏈接]
跳轉到指定樓層
樓主
發表于 2010-12-12 23:41:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 faruto 于 2011-4-18 22:38 編輯

安裝libsvm-mat是在MATLAB平臺下使用libsvm的前提,如果沒有安裝好也就無法使用,在MATLAB平臺下安裝libsvm-mat一般有以下幾個大步驟:


1. 將libsvm-mat所在工具箱添加到matlab工作搜索目錄
(File ——》
Set Path… ——》
Add with Subfolders...);
2. 選擇編譯器(mex -setup);
3. 編譯文件(make)。

每一步都很重要【我就不在每一步前面說 這一步很重要了~】,下面我將 掰餑餑說餡【一句東北俚語i.e.翔實詳盡】 的給大家詳細說明。

1. 將libsvm-mat所在文件夾目錄添加到MATLAB工作搜索目錄(File ——》 Set Path…——》 Add with Subfolders...)

這第一步很重要,如果沒有將libsvm-mat所在文件夾目錄正確的添加到MATLAB工作搜索目錄,使用的時候就會出現 ??? Undefined function or variable 'XXX'. 等等報錯。

首先明晰一下MATLAB工作搜索目錄(路徑)和當前目錄(路徑)這兩個概念:
當前目錄[Current Folder]是指MATLAB當前所在的路徑,MATLAB菜單欄下面有一個Current Folder可以在這里進行當前所在目錄的更改。
工作搜索目錄(路徑)是指當你使用某一個函數的時候,MATLAB可以進行搜索該函數的所有的目錄集合。

注:
當你使用某一個函數的時候,MATLAB首先會從當前目錄搜索調用該函數,如果當前目錄沒有該函數,MATLAB就會從工作搜索目錄按照從上到下的順序進行搜索調用該函數,如果工作搜索目錄中也沒有該函數,就會給出 ??? Undefined function or variable 'XXX' 這個報錯。所以呀,往后如果出現這個報錯,您不妨看一下您想調用的函數所在目錄是否添加到MATLAB工作搜索目錄中了。


說了這么多,第一步就是將libsvm-mat所在文件夾復制到某一個地方后,在MATLAB菜單欄中選擇 File ——》 Set Path…——》 Add with Subfolders... 然后選擇之前存放libsvm-mat的文件夾,然后點擊保存就可以了。

如果你添加到工作搜索目錄這個你還整不明白,可以看看這個帖子:
【原創】Matlab如何安裝新的工具箱
http://www.lsmn.icu/forum-v ... -fromuid-18677.html

說是第一步其實真正的第一步是打開電腦,囧~然后將libsvm-mat下載下來,下載地址如下:
Libsvm-mat林智仁先生的原始版本下載
libsvm-mat-2.91-1.zip
http://www.lsmn.icu/thread-9328-1-1.html
【說明:最新的版本為libsvm-mat-3.0-1.zip大家可以在這里下載http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 最新版本的改動是將SVM的model structure移動到了svm.h里面,對于常規用戶沒有影響基本和以前的都一樣,只是方便一些高級用戶自己進行底層代碼的修改】

Libsvm-mat faruto版本下載
libsvm-mat-2.89-3[FarutoUltimate3.0]
http://www.lsmn.icu/thread-9327-1-1.html

GUI版本下載【基于libsvm-mat-2.89-3[FarutoUltimate3.0]】
[原創]SVM_GUI_2.0[mcode][by_faruto]
http://www.lsmn.icu/forum-v ... -fromuid-18677.html

2. 選擇編譯器(mex -setup)

好多工具箱其實在上面那步之后就算是“安裝”成功了,有的小朋友可能會問:“為啥安裝libsvm-mat會選神馬編譯器,干嘛!?”,因為libsvm的原始版本是用c++寫的,這里為了能在MATLAB平臺下使用,需要用編譯器編譯一下,生成一個類似于.m文件的東東(. mexw32文件)這樣就可以在MATLAB平臺下使用libsvm了,所以這里需要在編譯之前選擇一個編譯器告訴MATLAB:“你丫就用這個我剛剛選擇的編譯器給我把 svmtrain.c && svmpredict.c等等一系列放在make.m中的文件名字給我編譯一下。”

這第一步也很重要,如果編譯器沒有選擇好的話,下一步進行make編譯的時候就會出現如下報錯:Unable to complete successfully.這個表示你沒有選擇好編譯器。

下面進行編譯器的選擇,哎,這里就涉及到一個問題,既然是“選擇”,那說明你電腦上需要安裝了編譯器才行,否則選你妹啊,是吧,哎,這就又涉及到一個問題:“神馬是編譯器?!”,這里俺就不解釋了,學過C語言的應該會懂得,不懂的百度去,這里我推薦使用Microsoft Visual C++ 6.0編譯器或者更高版本的visual studio,一般MATLAB會自帶一個編譯器Lcc-win32 C 但這個在這里無法使用!為啥呢?因為libsvm源代碼使用c++寫的,而Lcc-win32 C是一個c編譯器,無法編譯c++源代碼!
【日了,我都想吐了,真的這篇關于libsvm-mat在MATLAB平臺下的安裝的帖子我說的真的不能再詳細了,詳細的我都想吐了,要是還有人不明了如何安裝libsvm-mat那只能說明:1.我表達能力還是不行或者2.你丫真的太**了,我希望是前者~】

下面具體說說如何選擇編譯器。

首先在MATLAB命令窗【Commond Window】中輸入:

  1. mex -setup
復制代碼
Remark : 注意 mex 后面要打一個 空格 然后 是-setup。 千萬別忘記打一個空格,發現好多朋友在mex和-setup之間沒有打空格!!


會出現類似如下內容:
  1. Please choose your compiler for building external interface (MEX) files:

  2. Would you like mex to locate installed compilers [y]/n?
復制代碼
這里問你是否locate本機安裝的編譯器,正規的選擇y然后指定編譯器即可,我們先來看一下選擇y(選擇n在后面說),好下面我們選擇y。
根據你本機安裝的編譯器,會出現類似如下內容:
  1. Please choose your compiler for building external interface (MEX) files:

  2. Would you like mex to locate installed compilers [y]/n? y
  3. Select a compiler:
  4. [1] Lcc-win32 C 2.4.1 in D:\MATLAB~1\sys\lcc
  5. [2] Microsoft Visual C++ 6.0 in D:\Microsoft Visual Studio

  6. [0] None

  7. Compiler:

復制代碼
然后你選擇相應的編譯器并確認即可:
  1. Compiler: 2

  2. Please verify your choices:

  3. Compiler: Microsoft Visual C++ 6.0
  4. Location: D:\Microsoft Visual Studio

  5. Are these correct [y]/n? y

  6. Trying to update options file: C:\Users\faruto\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat
  7. From template:              D:\MATLAB~1\bin\win32\mexopts\msvc60opts.bat

  8. Done . . .
復制代碼
PS:matlab支持的編譯器列表在這里查看:
http://www.mathworks.com/support/compilers/current_release/

這樣就表示編譯器選擇成功了(此步驟中可能會出現warning警告是正常現象,不用管的說~)。


================================================================
如果你輸入 mex –setup后在
  1. Please choose your compiler for building external interface (MEX) files:

  2. Would you like mex to locate installed compilers [y]/n?
復制代碼
這一步選擇y后,可選擇的編譯器里面有沒你已經安裝的編譯器,表示MATLAB可能沒有識別記錄你安裝的編譯器的名字和目錄(有時候會發生這種情況),此時你應該重新輸入 mex –setup后選擇n手動進行編譯器的設置:
  1. mex -setup
  2. Please choose your compiler for building external interface (MEX) files:

  3. Would you like mex to locate installed compilers [y]/n? n

  4. Select a compiler:
  5. [1] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
  6. [2] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1 linker)
  7. [3] Lcc-win32 C 2.4.1
  8. [4] Microsoft Visual C++ 6.0
  9. [5] Microsoft Visual C++ .NET 2003
  10. [6] Microsoft Visual C++ 2005 SP1
  11. [7] Microsoft Visual C++ 2008 Express
  12. [8] Microsoft Visual C++ 2008 SP1
  13. [9] Open WATCOM C++

  14. [0] None

  15. Compiler: 4  %選擇的這個編譯器一定是你本機安裝了的,否則選擇了也沒有用

  16. Your machine has a Microsoft Visual C++ compiler located at
  17. D:\Microsoft Visual Studio. Do you want to use this compiler [y]/n?
復制代碼
這樣的話就可以手動選擇你想要的編譯器了,在
  1. Your machine has a Microsoft Visual C++ compiler located at
  2. D:\Microsoft Visual Studio. Do you want to use this compiler [y]/n?
復制代碼
這個確認步驟,如果你的編譯器的確是安裝在MATLAB給出的這個目錄(我這里是D:\Microsoft Visual Studio)那么選擇y確認即可,如果不是說明MATLAB沒有識別出安裝的地方,選擇n手動指定目錄即可,比如選擇n后的結果如下:
  1. Compiler: 4

  2. Your machine has a Microsoft Visual C++ compiler located at
  3. D:\Microsoft Visual Studio. Do you want to use this compiler [y]/n? n
  4. Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio]
復制代碼
此時輸入你安裝的編譯器的完整目錄即可比如:D:\Microsoft Visual Studio

這樣編譯器的選擇就結束了,相應會遇到的問題大概也就是上面這些了。

3. 編譯文件(make)

這一步說白了就是運行一下 libsvm-mat工具箱中的make.m文件。

首先需要把MATLAB的當前目錄[Current Folder]調整到libsvm-mat所在的文件夾,如果你要問神馬是“當前目錄”?看第一步中,有關“MATLAB工作搜索目錄(路徑)和當前目錄(路徑)這兩個概念”的講解,i.e.


當前目錄[Current Folder]是指MATLAB當前所在的路徑,MATLAB菜單欄下面有一個Current Folder可以在這里進行當前所在目錄的更改。
工作搜索目錄(路徑)是指當你使用某一個函數的時候,MATLAB可以進行搜索該函數的所有的目錄集合。
有人會問:“如何把MATLAB的當前目錄[Current Folder]調整到libsvm-mat所在的文件夾?”
答曰:先上個圖:

你點擊箭頭所指的那三個點,就能選擇libsvm-mat所在的目錄了,事先將libsvm-mat工具箱放在一個你想要放的位置即可~

然后在MATLAB命令窗【Commond Window】輸入
  1. make
復制代碼
如果成功運行沒有報錯,到此就說明libsvm-mat工具箱成功安裝了。Libsvm-mat工具箱中有自帶的heart_scale.mat測試數據集,可以運行以下代碼來check一下是否安裝成功:
  1. load heart_scale;
  2. model = svmtrain(heart_scale_label,heart_scale_inst);
  3. [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
復制代碼
如果出現下面這個結果,則說明肯定安裝成功了:
  1. Accuracy = 86.6667% (234/270) (classification)
復制代碼
注:編譯文件(make)這一步為神馬要把MATLAB的當前目錄[Current Folder]調整到libsvm-mat所在的文件夾呢?
答曰:因為這一步要運行libsvm-mat工具箱中的make.m文件,因為當你使用某一個函數的時候,MATLAB首先會從當前目錄搜索調用該函數,為了防止其他位置也有類似名字的make.m函數,所以這一步要把MATLAB的當前目錄[Current Folder]調整到libsvm-mat所在的文件夾,優先運行libsvm-mat文件夾下的make.m文件。

=========================================================
一些額外要說明的注意事項:
PS: make.m的文件內容如下:
  1. % This make.m is used under Windows

  2. mex -O -c svm.cpp
  3. mex -O -c svm_model_matlab.c
  4. mex -O svmtrain.c svm.obj svm_model_matlab.obj
  5. mex -O svmpredict.c svm.obj svm_model_matlab.obj
  6. mex -O libsvmread.c
  7. mex -O libsvmwrite.c
復制代碼
哦,對了,安裝完libsvm-mat工具箱,有的小朋友想要用 help svmtain 和 help svmpredict來查看這兩個函數的幫助文件,非常杯具的告訴你:
  1. 運行help svmtain 在較新版本下得到的是MATLAB自帶的svmtrain函數的幫助文件;
  2. 運行help svmpredict 會有如下報錯svmpredict not found.
復制代碼
因為svmtrain和svmpredict的源代碼是svmtrain.c和svmpredict.c即源代碼用c++寫的,編譯后生成的文件是svmtrain.mexw32和svmpredict.mexw3,而.mexw32這個編譯后的文件是加密過的,打開是亂碼,根本就沒有幫助文件解說,想看svmtrain和svmpredict的源代碼直接看svmtrain.c和svmpredict.c即可。O(∩_∩)O~

也有的小朋友測試過可以在別人電腦上進行編譯然后將編譯好的libsvm-mat工具箱復制過來,這樣在你的本機上只進行第一步就可以安裝成功了~這個是可以的,但我個人還是建議在本機也編譯一下才好,因為編譯的環境不同(32位或者64位或者XX差異)會導致可能使用別人編譯的會出現這樣那樣的小問題~anyway,就是提一下這個事!


下幾個帖子計劃 掰餑餑說餡 的給大家說說
如何使用libsvm進行分類
如何使用libsvm進行回歸
如何優化libsvm的各種參數
使用libsvm進行分類和回歸的通常的流程以及注意事項

這個最有技術含量了,因為總有朋友說用libsvm做分類或者回歸效果不好,我說把數據給我試一下,結果我做的效果一般都會比其要好,為啥捏?這里先簡單說一點點:使用libsvm(SVM)不是簡簡單單的用svmtrain輸入幾個參數 -c -g 生成model后用svmpredict來分類或者回歸,其實更重要的是前期的數據預處理和后期的參數選擇(歸一化范圍的選取,降維算法的選取,以及最佳參數選取的算法)這些才是關鍵,其實說白了如果這些您都搞得很透徹的話,選擇其他分類器也能做好,即這些(前期的數據預處理和后期的參數選擇)做好了,選擇神馬分類器真的并不重要,在libsvm-mat-2.89-3[FarutoUltimate3.0]工具箱中我把常見的數據預處理方法(歸一化,降維pca)和參數選擇算法(grid search 暴力搜索方法,啟發式GA、PSO方法)都封裝好了方便大家使用,同樣是用這個加強工具箱,但對于同一個測試數據集合,我敢保證肯定會有人用的效果就沒有我的好,為啥捏?因為知其然不知其所以然!肯定是其僅僅是了解一些表象的使用,而對于底層到底是怎么回事沒有搞清楚,這樣在具體的參數調整上肯定是不行的,這也回答之前的“為什么總有朋友說用libsvm做分類或者回歸效果不好,我說把數據給我試一下,結果我做的效果一般都會比其要好”的原因。

如何可視化libsvm的分類結果【虛幻的浮云~】
如何處理unbalanced label(不平衡數據標簽)問題【難點問題】

反正 我SVM 就會這么一點東西,早點說完早拉到~

PPS:這篇帖子我編輯了一天,用word整理出來大概是5-6頁,在此下個狠點的咒怨:誰TM要是轉載這個帖子不給出原始鏈接,不給出faruto作者名,我TM咒你做分類準確率全為0,做回歸mse巨大,平方相關系數巨小,各種考試全掛,畢業論文答辯通不過!

更多關于SVM的東西請看:
關于SVM的那點破事[長期更新整理 by faruto]
http://www.lsmn.icu/thread-10966-1-1.html

評分

參與人數 4威望 +3 貝殼 +2 收起 理由
glyqf + 1 對我這個初學者有很大幫助,謝謝
wuyusang + 1
f03681497 + 1
liaodie + 1 + 1

查看全部評分

推薦
發表于 2016-1-11 21:02:33 | 只看該作者
搞了兩天了,試裝過Visual Studio2015,不過是社區版的,試裝過很多Visual C++.都不行。一直是下面這個提示。
現在系統有
Microsoft Visual C++6.0 professional Edition
Microsoft Visual C++2005-2015的Redistributable
樓主!!!遇到同樣問題的,請教教我怎樣解決!!麻煩你們了!!!

>> mex-setup
MEX configured to use 'lcc-win32' for C language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
         variables with more than 2^32-1 elements. In the near future
         you will be required to update your code to utilize the
         new API. You can find more information about this at:
        鏈接不給發

To choose a different language, select one from the following:
mex -setup C++
mex -setup FORTRAN
Error using mex
No supported compiler or SDK was found. For options, visit  
鏈接不給發
回復 支持 4 反對 0

使用道具 舉報

推薦
發表于 2013-7-31 12:48:25 | 只看該作者
deeepsea 發表于 2013-7-27 19:54
為什么我 load heart_scale; 時,會出現錯誤,提示如下:

??? Error using ==> load

我已經解決了。導致這個問題的原因很簡單,你可以查看 heart_scale 文檔中的第2行和第3行列數確實不一樣。解決辦法:我們的 libsvm 版本比較新,所以不要使用樓主的命令測試,可以按照 libsvm 軟件包中的 matlab 目錄下的 README 文檔中的說明解決。具體依次執行:
=========================================================
>> [heart_scale_label,heart_scale_inst] = libsvmread('../heart_scale');
>> 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);
=========================================================
回復 支持 4 反對 0

使用道具 舉報

推薦
發表于 2016-7-31 22:26:03 | 只看該作者
load heart_scale;
model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);

這段代碼輸入以后顯示了一大段關于svmtrain的使用方法,model和predict_label值為空,
且accuracy: a vector with accuracy, mean squared error, squared correlation coefficient.
請問這怎么解決呢?求大神指導~謝謝
回復 支持 1 反對 0

使用道具 舉報

5
發表于 2010-12-13 11:26:29 | 只看該作者
foruto老大的巨作,一定要拜讀。果然講解很詳細,佩服佩服,比我還有耐心。

對人了不妨將word編輯成pdf然后上傳論壇,方便會員離線學習
6
 樓主| 發表于 2010-12-13 11:30:39 | 只看該作者
7
發表于 2010-12-23 11:06:06 | 只看該作者
本帖最后由 qingtian208 于 2010-12-23 11:07 編輯

我安裝libsvm時出現下面的情況
make.m
??? Attempt to reference field of non-structure array.


但是運行load heart_scale;
model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
Accuracy = 86.6667% (234/270) (classification)也出來你上面介紹的結果,怎么回事?
8
 樓主| 發表于 2010-12-23 16:54:49 | 只看該作者
回復 qingtian208 的帖子

您是嚴格按照上面的步驟來的~

check一下哪一步您做的和上面的不一樣~
9
發表于 2010-12-24 14:53:59 | 只看該作者
本帖最后由 qingtian208 于 2010-12-24 14:55 編輯

下面是我安裝的全過程:是嚴格按照您說的做的:
不過在安裝完第二步的時候出現了一個警告:
**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
                      Building with the -largeArrayDims option enables the new API.
**************************************************************************
中間有個網址鏈接,論壇不讓我發,是一個matlab的一個網址
10
 樓主| 發表于 2010-12-26 22:15:03 | 只看該作者
回復 qingtian208 的帖子

warning 不用理

一般警告都不用理的。有error才是出現問題了的~
11
發表于 2010-12-27 09:05:07 | 只看該作者
恩,好的,謝謝版主!
12
 樓主| 發表于 2010-12-27 09:52:26 | 只看該作者
回復 qingtian208 的帖子

恩,不客氣~
13
發表于 2010-12-29 20:52:25 | 只看該作者
夠詳細了,謝謝樓主!
您需要登錄后才可以回帖 登錄 | 注冊賬號

本版積分規則

QQ|網站地圖|MATLAB技術論壇|Simulink仿真論壇 ( 蜀ICP備19014457號 

GMT+8, 2019-8-12 07:25 , Processed in 0.105104 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
传奇电子琴弹奏
云南时时彩计划 时时计划群加 体彩20选5开奖结果查 广东时时11选五计划软件下载 2018年白小姐精准一码9999 广东快乐10分走势图广东 玩秒速时时的网站 江西快乐十分 山西快乐十分前三技巧 上海时时和值技巧 北京pk10开奖直播官方 上海快3开奖123期开奖号码 波色公式规律算法 吉林快三助手app 上海时时最快开奖结果查询结果 体彩大乐透开奖