多分類SVM的應用核函式的選取及程式碼示例
阿新 • • 發佈:2019-01-07
一、應用SVM的關鍵在於核函式的選用,常用於影象處理的核函式主要有三個:linear(線性核), rbf(徑向基函式),polynomial(多項式核)。
核函式的選用:針對不同的特徵向量型別選用不同的核函式,簡單選用核函式的方法就是:
1、linear:針對的是高維特徵向量,特徵向量裡面的值跳變不能太大,例如Gabor變換提取的影象特徵向量(4400維)。
2、rbf: 使用的範圍較廣,是SVM的預設核函式,適用於維數較低的,值跳變不大的特徵向量。(LBP提取的低維特徵向量,P鄰域值、u2對映、riu2對映會影響向量的維數)
3、polynomial : 多項式核函式,非常適用於影象處理,可調節引數 (可通過交叉驗證或者列舉法獲得)來獲得好的結果。
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工具箱進行分類。