知道這個庫已經很長的時間了,一直沒有實踐,以前也看過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
也會成功編譯文件。
- 在matlab中切換到解壓后的
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_scale
和heart_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