天天看點

在MATLAB中使用libSVM的方法在MATLAB中使用libSVM的方法

在MATLAB中使用libSVM的方法

libsvm庫下載下傳:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

詳解:http://www.matlabsky.com/thread-11925-1-1.html

安裝libsvm方法,參考部落格:http://blog.csdn.net/abcjennifer/article/details/7370177

先舉一個栗子:

代碼:

<span style="font-size:12px;"> clc,clear


%4個訓練樣本4*4,每個樣本4條屬性(特征)

train_data=[5.1 3.5 1.4 0.2;4.9 3.0 1.4 0.2;4.7 3.2 1.3 0.2;4.6 3.11.5 0.2];

%4個測試樣本4*4,每個樣本4條屬性(特征)

test_data=[5.0 3.6 1.4 0.2;5.4 3.9 1.7 0.4;4.6 3.4 1.4 0.3;5.0 3.41.5 0.2];


train_labels=[1,1,2,2]';%訓練樣本标簽4*1

test_labels=[1,1,1,1]';%測試樣本标簽4*1


model = svmtrain(train_labels, train_data);

[predict_label, accuracy,dec_values] =svmpredict(test_labels,test_data, model);

</span>
           

結果:

optimization finished, #iter = 2

nu = 1.000000

obj = -3.872840, rho = -0.009619

nSV = 4, nBSV = 4

Total nSV = 4

Accuracy = 75% (3/4) (classification)

1.分類問題處理整體正規流程

step1. 標明訓練集和測試集 >>規範化 >> 特征提取

step2. 利用訓練集訓練分類器得到model

step3. 利用model對測試集進行預測

step4. 分類器性能評測[分類準确率的高低

2.svmtrain(… )  通過訓練集來訓練模型

函數:model= svmtrain(train_label, train_matrix, ['libsvm_options']);

       -train_label:

                    An m by 1 vector oftraining labels (type must be double).   标簽資料應是m行1列的資料

       -train_matrix:

                   An m by n matrix of mtraining instances with n features.

                  It can be dense or sparse(type must be double).  訓練資料應是m行n列,m表示樣本數,n表示1個樣本有n中屬性

       -libsvm_options:

                  A stringof training options in the same format as that of LIBSVM.  是一個字元串如:'-c 2 -g 0.02 -t 2'

Options:可用的選項即表示的涵義如下:

       -ssvm類型:SVM設定類型(預設0)

                0 -- C-SVC(C-support vector classification)

                1 -- nu-SVC(nu-support vectorclassification)

                2 -- one-class SVM (distributionestimation)  一類SVM

                3 -- epsilon-SVR(epsilon-support vectorregression)

                4 -- nu-SVR (nu-support vectorregression)

  -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(gama):核函數中的gamma函數設定(針對多項式/rbf/sigmoid核函數)(預設1/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

        其中-g選項中的k是指輸入資料中的屬性數。option-v 随機地将資料剖分為n部分并計算互動檢驗準确度和均方根誤差。以上這些參數設定可以按照SVM的類型和核函數所支援的參數進行任意組合,如果設定的參數在函數或SVM類型中沒有也不會産生影響,程式不會接受該參數;如果應有的參數設定不正确,參數将采用預設值。

model:SVM根據樣本訓練的得到的分類器

      model是struct結構[Parameters, nr_class,totalSV, rho, Label, ProbA, ProbB, nSV, sv_coef, SVs]

      model.Parameters參數(均是使用者自定義或者預設的)意義從上到下依次為:

                 -s svm類型:SVM設定類型(預設0)

                 -t 核函數類型:核函數設定類型(預設2)

                 -d degree:核函數中的degree設定(針對多項式核函數)(預設3)

                -g r(gama):核函數中的gamma函數設定(針對多項式/rbf/sigmoid核函數)(預設類别數目的倒數)

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

      model.nr_class表示資料集中有多少類别;=2 for regression/one-class svm

      model.Label表示資料集中類别的标簽都是什麼

      model.totalSV代表總共的支援向量的數目

      model.nSV表示每類樣本的支援向量的數目

      model.ProbA和model.ProbB使用-b參數時才能用到,用于機率估計。

     -b  probability_estimates: whether to train a SVC or SVR model for probabilityestimates,0 or 1 (default 0)

      model.sv_coef是一個totalSV*1的矩陣,承裝的是totalSV個支援向量在決策函數中的系數

      model.SVs是一個totalSV×次元的稀疏矩陣,承裝的是totalSV個支援向量

      model.rho是決策函數中的常數項的相反數

3.svmpredict(….) 對測試集進行預測

      函數:[predicted_label,accuracy, decision_values/prob_estimates] = svmpredict(test_label, test_matrix,model, ['libsvm_options']);

      傳回參數:

      predict_label是預測标簽向量

      accuracy從上到下依次的意義分别是:

              -分類準率(分類問題中用到的參數名額)

             -平均平方誤差(MSE(mean squared error))[回歸問題中用到的參數名額]

             -平方相關系數(r2(squared correlation coefficient))[回歸問題中用到的參數名額]

    dec_values是一個包含decision值或機率估計(-b1)的矩陣,如果k個類,對于decision值,每行包含k(k-1)/2個二分類問題的結果;對于機率,每列包含k個屬于每類的機率值

4.注意事項

1.測試資料的格式要求必須是每一列代表一個屬性,每一列代表一個樣本.

2.資料類型需要是double型.

3.如果自己編寫的程式使用到libsvm,就應該将libsvm中的MATLAB代碼複制到自程式設計式位置,否則MATLAB會調用自帶的SVM程式,報錯“Ymust be a vector or a character array.”

4.跟編譯器有關吧,在使用SVM做預測的時候,傳回的參數必須填全,否則出來的預測結果是空的,即是:

[predicted_label, accuracy, decision_values] =svmpredict(test_label, test_matrix, model);

繼續閱讀