1. 程式人生 > >多分類SVM的應用核函式的選取及程式碼示例

多分類SVM的應用核函式的選取及程式碼示例

一、應用SVM的關鍵在於核函式的選用,常用於影象處理的核函式主要有三個:linear(線性核), rbf(徑向基函式),polynomial(多項式核)。

核函式的選用:針對不同的特徵向量型別選用不同的核函式,簡單選用核函式的方法就是:

1、linear:針對的是高維特徵向量,特徵向量裡面的值跳變不能太大,例如Gabor變換提取的影象特徵向量(4400維)。

2、rbf: 使用的範圍較廣,是SVM的預設核函式,適用於維數較低的,值跳變不大的特徵向量。(LBP提取的低維特徵向量,P鄰域值、u2對映、riu2對映會影響向量的維數)

3、polynomial : 多項式核函式,非常適用於影象處理,可調節引數\sigma

(可通過交叉驗證或者列舉法獲得)來獲得好的結果。

clc
clear
close all
a = [];
k =3;
b=[];

load break.mat  
load finger.mat
load good.mat

%% 測試資料
data4 = data1(501:1001,:);
data5 = data2(501:1000,:);
data6 = data3(501:1020,:);
% data4 = datavector4;
%% 訓練資料
data1 = data1(1:500,:);
data2 = data2(1:500,:);
data3 = data3(1:500,:);
train1=[data1;data2;data3];
train1=train1./sum(train1,2);
%%
size(data2)
train12 = [data1;data2];
train13 = [data1;data3];
train23 = [data2;data3];
train12 = train12./sum(train12,2);
train13 = train13./sum(train13,2);
train23 = train23./sum(train23,2);

% test = [data4;data6];
% size(test)
test = [data4;data5;data6];
test = test./sum(test,2);
size(test)
%% 決策樹
%  train = [data1;data2;data3];
% train = train./sum(train,2);
% test = [data4;data5;data6];
% test = test./sum(test,2);
% label = [ones(500,1);2*ones(500,1);3*ones(500,1)];
% 
% testtarget = C4_5(train',label,test',5,10)   %%決策樹C4.5
%%
label = [ones(1,500),zeros(1,500)]';
svmModel1 = svmtrain(train12,label,'kernel_function','linear','showplot',true)
svmModel2 = svmtrain(train13,label,'kernel_function','linear','showplot',true);
svmModel3 = svmtrain(train23,label,'kernel_function','linear','showplot',true)
% result13 = svmclassify(svmModel2,test,'showplot',true)
% a=result13'
label1 = [ones(1,500),2*ones(1,500),3*ones(1,500)];
%     KNNMdl = fitcknn(train1,label1, 'NumNeighbors',k,'Standardize',1);
%b = KNN(test,train1,label1,3);
for i = 1:size(test,1)
    aa = test(i,:);
    result12 = svmclassify(svmModel1,aa,'showplot',true);
    result13 = svmclassify(svmModel2,aa,'showplot',true);
    result23 = svmclassify(svmModel3,aa,'showplot',true);    

    if result12 == 1 && result13 == 1
        testLabel = 1;   %%裂紋
    elseif result12 == 0 && result23 == 1
        testLabel = 2;   %%斷柵
    elseif result13 == 0 && result23 == 0
        testLabel = 3;
    else
        testLabel = -1;
    end
    a = [a,testLabel];

%    testlabel1 = predict(KNNMdl,aa);
%    b = [b,testlabel1];
end 
a   %%多分類結果
% testtarget 
%b

         二、多分類SVM 也是基於二分類的基礎上來做的,上面的程式只能實現3分類(其實是四類1,2,3,-1(未分類)),首先要訓練3個分類器(Classify12,Classify13,Classify23),Classify12由第一類特徵向量和第二類特徵向量訓練得到的,Classify13由第一類特徵向量和第三類特徵向量訓練得到,Classify23由第二類特徵向量和第三類特徵向量訓練得到。訓練完成之後,將測試資料輸入,如果Classify12分類結果是1,Classify13也是1,Classify23是2,三個分類器投票,相當於1得了2票,2得了1票,選擇票數最多的1,如果分類器結果是1,2,3的話,就將其分到-1類裡面。原理說白了就是用二分類進行多分類。

       三、也可用LibSVM工具箱進行分類。