SVM支持向量机二维数据分类matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

      支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) 。
       SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 。

       SVM是由模式识别中广义肖像算法(generalized portrait algorithm)发展而来的分类器,其早期工作来自前苏联学者Vladimir N. Vapnik和Alexander Y. Lerner在1963年发表的研究。1964年,Vapnik和Alexey Y. Chervonenkis对广义肖像算法进行了进一步讨论并建立了硬边距的线性SVM 。此后在二十世纪70-80年代,随着模式识别中最大边距决策边界的理论研究 、基于松弛变量(slack variable)的规划问题求解技术的出现,和VC维(Vapnik-Chervonenkis dimension, VC dimension)的提出,SVM被逐步理论化并成为统计学习理论的一部分 。1992年,Bernhard E. Boser、Isabelle M. Guyon和Vapnik通过核方法得到了非线性SVM。1995年,Corinna Cortes和Vapnik提出了软边距的非线性SVM并将其应用于手写字符识别问题,这份研究在发表后得到了关注和引用,为SVM在各领域的应用提供了参考。

        基于支持向量机(Support Vector Machines,SVM)的训练学习算法,其主要原理是通过统计学理论,使得其具备以较少数量的训练数据样本来完成分类器的训练。而传统的基于神经网络的学习理论,往往需要较大数量的样本作为训练数据,因此传统的神经网络学习方法其对样本数量的依赖性较大。所以,采用SVM支持向量机的分类方法优于采用神经网络的分类方法。通过SVM支持向量机的分类算法,其首先需要对数据进行预处理,将维度较高的特征数据转换为低维度的特征数据,然后通过一个非线性映射函数产生一个对数据进行分割的超平面。因此,基于SVM支持向量机的分类算法,其本质是通过样本数据对非线性映射函数的训练和学习,从而得到适用于当前训练样本的非线性映射函数。根据实现非线性映射函数的不同方式,SVM可以分为线性可分和非线性可分两种类型。下面对这两种SVM的基本原理进行介绍。
————————————————

  

 

 

二、核心程序

function svm = svmTrain(svmType,X,Y,ker,p1,p2)

%生成/改变优化选项结构
options = optimset;
options.LargeScale = 'off';
options.Display = 'off';
switch svmType
    case 'svc_c',
        C = p1;
        n = length(Y);
        H = (Y*Y').*kernel(ker,X,X);
        f = -ones(1,n);
        A = [];
        b = [];
        Aeq = Y';
        beq = 0;
        lb = zeros(n,1);
        ub = C*ones(n,1);
        a0 = zeros(n,1);
        [a,fval,eXitflag,output,lambda]=quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);                    
    case 'svr_epsilon',
        C = p1;
        e = p2;
        n = length(Y);
        Q = kernel(ker,X,X);
        H = [Q,-Q;-Q,Q];
        f = [e*ones(n,1)-Y;e*ones(n,1)+Y]; 
        A = [];
        b = [];
        Aeq = [ones(1,n),-ones(1,n)];
        beq = 0;
        lb = zeros(2*n,1); 
        ub = C*ones(2*n,1);
        a0 = zeros(2*n,1);
        [a,fval,eXitflag,output,lambda]=quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options); 
        a = a(1:n)-a(n+1:end);
    otherwise,
end
eXitflag;
% ------------------------------------------------------------%
% 输出 svm
svm.type = svmType;
svm.ker = ker;
svm.x = X;
svm.y = Y;
svm.a = a;
up211
function Yd = svmSim(svm,Xt)

type = svm.type;
ker = svm.ker;
X = svm.x;
Y = svm.y;
a = svm.a;
% ------------------------------------------------------------%
% 测试输出
epsilon=1e-6;                  % 如果小于此值则认为是0
i_sv = find(abs(a)>epsilon);          % 支持向量下标
switch type
    case 'svc_c',
        tmp = ((a(i_sv,:).*Y(i_sv,:))'*kernel(ker,X(i_sv,:),X(i_sv,:)))'; % 行向量
        b = 1./Y(i_sv)-tmp;
        b = mean(b);
        tmp=((a.*Y)'*kernel(ker,X,Xt))';
        Yd = sign(tmp+b);
    case 'svr_epsilon',
        tmp = (a(i_sv)'*kernel(ker,X(i_sv,:),X(i_sv,:)))';   % 列向量
        b = Y(i_sv)-tmp; 
        if length(b)~=0
           b = mean(b); 
        else
            b=0;
        end
        tmp=(a'*kernel(ker,X,Xt))';
        Yd=tmp+b; 
    otherwise,
end

三、仿真结论

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130838763