多分类SVM的应用核函数的选取及代码示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38784454/article/details/82343768

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

猜你喜欢

转载自blog.csdn.net/qq_38784454/article/details/82343768