當前位置:編程學習大全網 - 源碼下載 - 怎麽在在libsvm 中的matab 路徑下運行程序

怎麽在在libsvm 中的matab 路徑下運行程序

壹 安裝

1. 下載

在LIBSVM的主頁上下載最新版本的軟件包,並解壓到合適目錄中。

2. 編譯

如果妳使用的是64位的操作的系統和Matlab,那麽不需要進行編譯步驟,因為自帶軟件包中已經包含有64位編譯好的版本:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64。否則,需要自己編譯二進制文件。

首先在Mtlab中進入LIBSVM根目錄下的matlab目錄(如C:\libsvm-3.17\matlab),在命令窗口輸入

>>mex –setup

然後Matlab會提示妳選擇編譯mex文件的C/C++編譯器,就選擇壹個已安裝的編譯器,如Microsoft Visual C++ 2010。之後Matlab會提示確認選擇的編譯器,輸入y進行確認。

然後可以輸入以下命令進行編譯。

>>make

註意,Matlab或VC版本過低可能會導致編譯失敗,建議使用最新的版本。

編譯成功後,當前目錄下會出現若幹個後綴為mexw64(64位系統)或mexw32(32位系統)的文件。

3. 重命名(可選,但建議執行)

編譯完成後,在當前目錄下回出現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這兩個名字進行調用。

4. 添加路徑

為了以後使用的方便,建議把LIBSVM的編譯好的文件所在路徑(如C:\libsvm-3.17\matlab)添加到Matlab的搜索路徑中。具體操作為:(中文版Matlab對應進行)

HOME -> Set Path -> Add Folder -> 加入編譯好的文件所在的路徑(如C:\libsvm-3.17\matlab)

當然也可以把那4個編譯好的文件復制到想要的地方,然後再把該路徑添加到Matlab的搜索路徑中。

二 測試

LIBSVM軟件包中自帶有測試數據,為軟件包根目錄下的heart_scale文件,可以用來測試LIBSVM是否安裝成功。這裏的heart_scale文件不能用Matlab的load進行讀取,需要使用libsvmread讀取。

進入LIBSVM的根目錄運行以下代碼(因為heart_scale文件沒有被添加進搜索路徑中,其他路徑下無法訪問這個文件):

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

model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');

[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);

如果LIBSVM安裝正確的話,會出現以下的運行結果,顯示正確率為86.6667%。

*

optimization finished, #iter = 134

nu = 0.433785

obj = -101.855060, rho = 0.426412

nSV = 130, nBSV = 107

Total nSV = 130

Accuracy = 86.6667% (234/270) (classification)

三 原理簡介

使用SVM前首先得了解SVM的工作原理,簡單介紹如下。

SVM(Support Vector Machine,支持向量機)是壹種有監督的機器學習方法,可以學習不同類別的已知樣本的特點,進而對未知的樣本進行預測。

SVM本質上是壹個二分類的算法,對於n維空間的輸入樣本,它尋找壹個最優的分類超平面,使得兩類樣本在這個超平面下可以獲得最好的分類效果。這個最優可以用兩類樣本中與這個超平面距離最近的點的距離來衡量,稱為邊緣距離,邊緣距離越大,兩類樣本分得越開,SVM就是尋找最大邊緣距離的超平面,這個可以通過求解壹個以超平面參數為求解變量的優化問題獲得解決。給定適當的約束條件,這是壹個二次優化問題,可以通過用KKT條件求解對偶問題等方法進行求解。

對於不是線性可分的問題,就不能通過尋找最優分類超平面進行分類,SVM這時通過把n維空間的樣本映射到更高維的空間中,使得在高維的空間上樣本是線性可分的。在實際的算法中,SVM不需要真正地進行樣本點的映射,因為算法中涉及到的高維空間的計算總是以內積的形式出現,而高維空間的內積可以通過在原本n維空間中求內積然後再進行壹個變換得到,這裏計算兩個向量在隱式地映射到高維空間的內積的函數就叫做核函數。SVM根據問題性質和數據規模的不同可以選擇不同的核函數。

雖然SVM本質上是二分類的分類器,但是可以擴展成多分類的分類器,常見的方法有壹對多(one-versus-rest)和壹對壹(one-versus-one)。在壹對多方法中,訓練時依次把k類樣本中的某個類別歸為壹類,其它剩下的歸為另壹類,使用二分類的SVM訓練處壹個二分類器,最後把得到的k個二分類器組成k分類器。對未知樣本分類時,分別用這k個二分類器進行分類,將分類結果中出現最多的那個類別作為最終的分類結果。而壹對壹方法中,訓練時對於任意兩類樣本都會訓練壹個二分類器,最終得到k*(k-1)/2個二分類器,***同組成k分類器。對未知樣本分類時,使用所有的k*(k-1)/2個分類器進行分類,將出現最多的那個類別作為該樣本最終的分類結果。

LIBSVM中的多分類就是根據壹對壹的方法實現的。

四 使用

關於LIBSVM在Matlab中的使用,可以參看軟件包中matlab目錄下的README文件,這裏對裏面內容做壹個翻譯和壹些細節的講解。

1. 訓練

libsvm函數用於對訓練集的數據進行訓練,得到訓練好的模型。

model = libsvmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

這個函數有三個參數,其中

-training_label_vector:訓練樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。這裏可以是二分類和多分類,類標是(-1,1)、(1,2,3)或者其他任意用來表示不同的類別的數字,要轉成double類型。

-training_instance_matrix:訓練樣本的特征,如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。

-libsvm_options:訓練的參數,在第3點詳細介紹。

2. 預測

libpredict函數用於對測試集的數據進行測試,還能對未知樣本進行預測。

[predicted_label, accuracy, decision_values/prob_estimates]

= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

這個函數包括四個參數,其中

-testing_label_vector:測試樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。如果類標未知,可以初始化為任意m x 1的double數組。

-testing_instance_matrix:測試樣本的特征,如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。

-model:使用libsvmtrain返回的模型

-libsvm_options:預測的參數,與訓練的參數形式壹樣。

3. 訓練的參數

LIBSVM訓練時可以選擇的參數很多,包括:

-s svm類型:SVM設置類型(默認0)

0 — C-SVC; 1 –v-SVC; 2 – 壹類SVM; 3 — e-SVR; 4 — v-SVR

-t 核函數類型:核函數設置類型(默認2)

0 – 線性核函數:u’v

1 – 多項式核函數:(r*u’v + coef0)^degree

2 – RBF(徑向基)核函數:exp(-r|u-v|^2)

3 – sigmoid核函數:tanh(r*u’v + coef0)

-d degree:核函數中的degree設置(針對多項式核函數)(默認3)

-g r(gamma):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/k,k為總類別數)

-r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)

-c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1)

-n nu:設置v-SVC,壹類SVM和v- SVR的參數(默認0.5)

-p p:設置e -SVR 中損失函數p的值(默認0.1)

-m cachesize:設置cache內存大小,以MB為單位(默認40)

-e eps:設置允許的終止判據(默認0.001)

-h shrinking:是否使用啟發式,0或1(默認1)

-wi weight:設置第幾類的參數C為weight*C (C-SVC中的C) (默認1)

-v n: n-fold交互檢驗模式,n為fold的個數,必須大於等於2

以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將采用默認值。

4. 訓練返回的內容

libsvmtrain函數返回訓練好的SVM分類器模型,可以用來對未知的樣本進行預測。這個模型是壹個結構體,包含以下成員:

-Parameters: 壹個5 x 1的矩陣,從上到下依次表示:

-s SVM類型(默認0);

-t 核函數類型(默認2)

-d 核函數中的degree設置(針對多項式核函數)(默認3);

-g 核函數中的r(gamma)函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數);

-r 核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)

-nr_class: 表示數據集中有多少類別,比如二分類時這個值即為2。

-totalSV: 表示支持向量的總數。

-rho: 決策函數wx+b中的常數項的相反數(-b)。

-Label: 表示數據集中類別的標簽,比如二分類常見的1和-1。

-ProbA: 使用-b參數時用於概率估計的數值,否則為空。

-ProbB: 使用-b參數時用於概率估計的數值,否則為空。

-nSV: 表示每類樣本的支持向量的數目,和Label的類別標簽對應。如Label=[1; -1],nSV=[63; 67],則標簽為1的樣本有63個支持向量,標簽為-1的有67個。

-sv_coef: 表示每個支持向量在決策函數中的系數。

-SVs: 表示所有的支持向量,如果特征是n維的,支持向量壹***有m個,則為m x n的稀疏矩陣。

另外,如果在訓練中使用了-v參數進行交叉驗證時,返回的不是壹個模型,而是交叉驗證的分類的正確率或者回歸的均方根誤差。

5. 預測返回的內容

libsvmtrain函數有三個返回值,不需要的值在Matlab可以用~進行代替。

-predicted_label:第壹個返回值,表示樣本的預測類標號。

-accuracy:第二個返回值,壹個3 x 1的數組,表示分類的正確率、回歸的均方根誤差、回歸的平方相關系數。

-decision_values/prob_estimates:第三個返回值,壹個矩陣包含決策的值或者概率估計。對於n個預測樣本、k類的問題,如果指定“-b 1”參數,則n x k的矩陣,每壹行表示這個樣本分別屬於每壹個類別的概率;如果沒有指定“-b 1”參數,則為n x k*(k-1)/2的矩陣,每壹行表示k(k-1)/2個二分類SVM的預測結果。

6. 讀取或保存

libsvmread函數可以讀取以LIBSVM格式存儲的數據文件。

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

這個函數輸入的是文件的名字,輸出為樣本的類標和對應的特征。

libsvmwrite函數可以把Matlab的矩陣存儲稱為LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

這個函數有三個輸入,分別為保存的文件名、樣本的類標和對應的特征(必須為double類型的稀疏矩陣)。

五 更新:svdd擴展安裝(2014.10)

從libsvm官網下載svdd工具箱,目前使用libsvm3.18以及svdd3.18版本。

svdd工具箱裏面有壹個matlab文件夾和3個文件svm.cpp、svm.h、svm-train.c。

將matlab文件夾中的文件svmtrain.c覆蓋原libsvm的matlab文件夾中的文件。

將svm.cpp、svm.h、svm-train.c這3個文件覆蓋libsvm文件夾下的相同文件。

按本文剛開始講述的方法進行mex -setup、make等完成安裝,根據需要進行改名以及添加Path。

  • 上一篇:使用 IDEA 從 0 開始搭建 Spring Cloud 微服務
  • 下一篇:沃視頻的標清免流是不是真的免流觀看,為什麽我用了又扣費了?
  • copyright 2024編程學習大全網