一、应用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工具箱进行分类。