精华内容
下载资源
问答
  • matlab实现分类svm

    千次阅读 2020-04-19 00:41:08
    matlab独自实现分类svm-csdn matlab独自实现分类svm-git-hub 设计思路 SVM也叫支持向量机,其是一个二分类器,但是对于分类,SVM也可以实现。主要方法就是训练个二分类器。常见的有以下两种方式: 一对...

    多分类SVM

    相关资料

    libsvm开源库
    libsvm matlab安装
    matlab独自实现多分类svm-csdn
    matlab独自实现多分类svm-git-hub

    设计思路

    SVM也叫支持向量机,其是一个二类分类器,但是对于多分类,SVM也可以实现。主要方法就是训练多个二类分类器。常见的有以下两种方式:

    • 一对一(one-vs-one)
      给定m个类,对m个类中的每两个类都训练一个分类器,总共的二类分类器个数为 m(m-1)/2 .比如有三个类,1,2,3,那么需要有三个分类器,分别是针对:1和2类,1和3类,2和3类。对于一个需要分类的数据x,它需要经过所有分类器的预测,最后使用投票的方式来决定x最终的类属性。
    • 一对多(one-vs-rest)
      给定m个类,需要训练m个二类分类器。其中的分类器 i 是将 i 类数据设置为类1(正类),其它所有m-1个i类以外的类共同设置为类2(负类),这样,针对每一个类都需要训练一个二类分类器,最后,我们一共有 m 个分类器。对于一个需要分类的数据 x,通常选择置信度最大的类别标记为分类结果。

    由于类别较多,本实验采用一对多方式预测

    代码

    function y_predict = my_MultiSvm(X_train, y_train, X_test)
    % multi svm
    % one vs all 模型
    % Input:
    % X_train: n*m矩阵 n为训练集样本数 m为特征数
    % y_train: n*1向量 为训练集label,支持任意多种类
    % X_test: n*m矩阵 n为测试集样本数 m为特征数
    % Output:
    % y_predict: n*1向量 测试集的预测结果
    % 
    % Copyright(c) lihaoyang 2020
    %
    
        y_labels = unique(y_train);
        n_class = size(y_labels, 1);
        models = cell(n_class, 1);
        % 训练n个模型
        for i = 1:n_class
            class_i_place = find(y_train == y_labels(i));
            svm_train_x = X_train(class_i_place,:);
            sample_num = numel(class_i_place);
            class_others = find(y_train ~= y_labels(i));
            randp = randperm(numel(class_others));
            svm_train_minus = randp(1:sample_num)';
            svm_train_x = [svm_train_x; X_train(svm_train_minus,:)];
            svm_train_y = [ones(sample_num, 1); -1*ones(sample_num, 1)];
            disp(['生成模型:', num2str(i)])
            models{i} = fitcsvm(svm_train_x, svm_train_y);
        end
        test_num = size(X_test, 1);
        y_predict = zeros(test_num, 1);
        % 对每条数据,n个模型分别进行预测,选择label为1且概率最大的一个作为预测类别
        for i = 1:test_num
            if mod(i, 100) == 0
                disp(['预测个数:', num2str(i)])
            end
            bagging = zeros(n_class, 1);
            for j = 1:n_class
                model = models{j};
                [label, rat] = predict(model, X_test(i,:));
                bagging(j) = bagging(j) + rat(2);
            end
            [maxn, maxp] = max(bagging);
            y_predict(i) = y_labels(maxp);
        end
    end
    
    
    展开全文
  • Matlab 实现线性svm两类和多类分类器

    万次阅读 热门讨论 2018-01-18 21:59:43
    网上有很写的好的博客讲解线性分类和SVM,本人讲解能力差,就给个链接。 http://blog.csdn.net/mm_bit/article/details/46988925 SVM实现代码 训练svm分类器实际上是解二次规划问题,matlab里用到的是...

    线性分类和SVM原理

    网上有很多写的好的博客讲解线性分类和SVM,本人讲解能力差,就给个链接。
    http://blog.csdn.net/mm_bit/article/details/46988925

    SVM实现代码

    训练svm分类器实际上是解二次规划问题,matlab里用到的是quadprog函数,其使用用法可参见matlab官方文档:
    http://cn.mathworks.com/help/optim/ug/quadprog.html
    或者不想读英文文档的人可以看别人写的博客:
    http://blog.csdn.net/jbb0523/article/details/50598641
    会使用quadprog函数基本上就会写svm分类器了,这里贴上源码:
    svmTrain.m

    function [ svm ] = svmTrain( trainData,trainLabel,kertype,C )
    options=optimset;
    options.LargerScale='off';
    options.Display='off';
    
    n=length(trainLabel);
    H=(trainLabel'*trainLabel).*kernel(trainData,trainData,kertype);
    f=-ones(n,1);
    A=[];
    b=[];
    Aeq=trainLabel;
    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);
    epsilon=1e-8;
    sv_label=find(abs(a)>epsilon);
    svm.a=a(sv_label);
    svm.Xsv=trainData(:,sv_label);
    svm.Ysv=trainLabel(sv_label);
    svm.svnum=length(sv_label);
    end
    
    

    kernel.m(更新)

    function K = kernel( X,Y,type )
    switch type
        case 'linear'
            K=X'*Y;
        case 'rbf'
            delta=5;
            delta=delta*delta;
            XX=sum(X'.*X',2);
            YY=sum(Y'.*Y',2);
            XY=X'.*Y;
            K=abs(repmat(XX,[1 size(YY,1)])+repmat(YY',[size(XX,1) 1])-2*XY);
            K=exp(-K./delta);
    end
    end

    svmTest.m:

    function result = svmTest(svm, Xt, Yt, kertype)  
    temp = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,svm.Xsv,kertype);  
    %total_b = svm.Ysv-temp;  
    b = mean(svm.Ysv-temp);  %b取均值  
    w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype);  
    result.score = w + b;  
    Y = sign(w+b);  %f(x)  
    result.Y = Y;  
    result.accuracy = size(find(Y==Yt))/size(Yt);  
    end  
    
    

    test.m

    %------------主函数----------------  
    clc;
    clear;
    C = 10;  %成本约束参数  
    kertype = 'linear';  %线性核  
    
    %①------数据准备  
    n = 30;  
    %randn('state',6);   %指定状态,一般可以不用  
    x1 = randn(2,n);    %2行N列矩阵,元素服从正态分布  
    y1 = ones(1,n);       %1*N个1  
    x2 = 4+randn(2,n);   %2*N矩阵,元素服从正态分布且均值为5,测试高斯核可x2 = 3+randn(2,n);   
    y2 = -ones(1,n);      %1*N个-1  
    
    figure;  %创建一个用来显示图形输出的一个窗口对象  
    plot(x1(1,:),x1(2,:),'bs',x2(1,:),x2(2,:),'k+');  %画图,两堆点  
    axis([-3 8 -3 8]);  %设置坐标轴范围  
    hold on;    %在同一个figure中画几幅图时,用此句  
    
    %②-------------训练样本  
    X = [x1,x2];        %训练样本2*n矩阵,n为样本个数,d为特征向量个数  
    Y = [y1,y2];        %训练目标1*n矩阵,n为样本个数,值为+1或-1  
    svm = svmTrain(X,Y,kertype,C);  %训练样本  
    plot(svm.Xsv(1,:),svm.Xsv(2,:),'ro');   %把支持向量标出来  
    
    %③-------------测试  
    [x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7);  %x1和x2都是181*181的矩阵  
    [rows,cols] = size(x1);    
    nt = rows*cols;                    
    Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];  
    %前半句reshape(x1,1,nt)是将x1转成1*(181*181)的矩阵,所以xt是2*(181*181)的矩阵  
    %reshape函数重新调整矩阵的行、列、维数  
    Yt = ones(1,nt);  
    
    result = svmTest(svm, Xt, Yt, kertype);  
    
    %④--------------画曲线的等高线图  
    Yd = reshape(result.Y,rows,cols);  
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    title('svm分类结果图');     
    x1=xlabel('X轴');    
    x2=ylabel('Y轴');   

    分类结果:
    这里写图片描述

    多类分类器

    多类线性问题的一种解法是将多类分为多个两类分类器。
    如训练集有1,2,3,4个类,让1与2作两类分类器训练得到12分类器,1与3得到13分类器,等等两两训练,得到(4-1)*4/2 6个分类器,再将测试数据用这6个分类器一一测试,如果对12,13,14三个都是正的,则该类属于1类。
    代码:
    multiLiner:

    clc;
    clear;
    C=10;
    kertype='linear';
    %生成测试数据
    n=30;
    x1=randn(2,n);
    x2=4+randn(2,n);
    
    x3=randn(2,n);
    x3=[x3(1,:)+4;x3(2,:)-4];
    
    x4=randn(2,n);
    x4=[x4(1,:)+8;x4(2,:)];
    %可视化生成数据
    plot(x1(1,:),x1(2,:),'bs',x2(1,:),x2(2,:),'k+');
    hold on;
    plot(x3(1,:),x3(2,:),'r*',x4(1,:),x4(2,:),'y.');
    axis([-3 11 -7 7]);
    hold on;
    %两两合成一个训练组训练模型
    trainData12=[x1,x2];
    trainData13=[x1,x3];
    trainData14=[x1,x4];
    trainData23=[x2,x3];
    trainData24=[x2,x4];
    trainData34=[x3,x4];
    trainLabel=[ones(1,n),-ones(1,n)];
    
    svm_12=svmTrain(trainData12,trainLabel,kertype,C);
    svm_13=svmTrain(trainData13,trainLabel,kertype,C);
    svm_14=svmTrain(trainData14,trainLabel,kertype,C);
    svm_23=svmTrain(trainData23,trainLabel,kertype,C);
    svm_24=svmTrain(trainData24,trainLabel,kertype,C);
    svm_34=svmTrain(trainData34,trainLabel,kertype,C);
    
    %生成测试数据
    [x1,x2] = meshgrid(-2:0.05:10,-6:0.05:6);  %x1和x2都是181*181的矩阵  
    [rows,cols] = size(x1);    
    nt = rows*cols;                    
    Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];  
    %前半句reshape(x1,1,nt)是将x1转成1*(181*181)的矩阵,所以xt是2*(181*181)的矩阵  
    %reshape函数重新调整矩阵的行、列、维数  
    Yt = ones(1,nt);  
    result12=svmTest(svm_12,Xt,Yt,kertype);
    Yd = reshape(result12.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    hold on;
    result13=svmTest(svm_13,Xt,Yt,kertype);
    Yd = reshape(result13.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    hold on;
    result14=svmTest(svm_14,Xt,Yt,kertype);
    Yd = reshape(result14.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    hold on;
    result23=svmTest(svm_23,Xt,Yt,kertype);
    Yd = reshape(result23.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    hold on;
    result24=svmTest(svm_24,Xt,Yt,kertype);
    Yd = reshape(result24.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
    hold on;
    result34=svmTest(svm_34,Xt,Yt,kertype);
    Yd = reshape(result34.Y,rows,cols); 
    contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线
    
    %测试一个样本点属于哪一类
    Xt=[10;2];
    Yt=1;
    result12=svmTest(svm_12,Xt,Yt,kertype);
    result13=svmTest(svm_13,Xt,Yt,kertype);
    result14=svmTest(svm_14,Xt,Yt,kertype);
    result23=svmTest(svm_23,Xt,Yt,kertype);
    result24=svmTest(svm_24,Xt,Yt,kertype);
    result34=svmTest(svm_34,Xt,Yt,kertype);
    if result12.Y==1&&result13.Y==1&&result14.Y==1
        testLabel=1;
    elseif result12.Y==-1&&result23.Y==1&&result24.Y==1
        testLabel=2;
    elseif result13.Y==-1&&result23.Y==-1&&result34.Y==1
        testLabel=3;
    elseif result14.Y==-1&&result24.Y==-1&&result34.Y==-1
        testLabel=4;
    else
        testLabel=-1;
        disp('测试点不属于这4类中');
    end

    分类结果:
    这里写图片描述

    展开全文
  • SVMmatlab代码及SVM分类的作法

    千次阅读 2019-04-02 14:51:55
    SVM是常用的一种有监督的学习模型(即给你一些输入特征,告诉你这些特征的样本是属于A,再给你一些输入特征,告诉你这些特征的样本是属于B,现在再来一些数据,来判断它们是属于哪一)。 它与Kmeans的区别在于...

    转载自: https://blog.csdn.net/fengsigaoju/article/details/52314885

    SVM是常用的一种有监督的学习模型(即给你一些输入特征,告诉你这些特征的样本是属于A类,再给你一些输入特征,告诉你这些特征的样本是属于B类,现在再来一些数据,来判断它们是属于哪一类)。

    它与Kmeans的区别在于kmenas是无监督的学习模型,即kmeans不需要提前知道(训练),只要你把特征给我,我根据特征分就完事了.

    它与Knn的区别在于knn来一个就算一次(和集合内的其余点进行比较),而SVM相当于一开始先把前期工作做好了(训练好),然后来一个我就根据带到训练的结果中一代就完事,

    所以knn如果数据量太大或者维度太高就gg,因为我要与其数据集内比较(就算一些优化策略比较次数还是很多),而SVM有一种一劳永逸的感觉

    线性SVM的一般流程:

    1,数据标准化处理(减去平均值./标准差)

    2,划出一个平面分割出所有的特征(也就是转化为规划模型求解)

    3,训练结束后将待预测数据带入.

    下面为一份训练集

    我想根据资产折现力和盈利能力,活性来划分两个类别。


    编号 资产折现力 盈利能力 活性 类别
    1 0.9 0.34 1.53 1
    2 0.88 0.23 1.67 1
    3 0.92 0.28 1.43 1
    4 0.89 0.14 1.24 1
    5 0.78 0.35 1.8 1
    6 0.81 0.26 2.01 1
    7 0.72 0.18 1.75 1
    8 0.93 0.22 0.99 1
    9 0.82 0.26 1.4 1
    10 0.78 0.26 1.34 -1
    11 0.78 0.27 1.67 -1
    12 0.72 0.18 1.53 -1
    13 0.69 0.16 1.2 -1
    14 0.63 0.15 0.88 -1
    15 0.58 0.22 1.42 -1
    16 0.81 0.18 1.59 -1
    17 0.67 0.21 1.21 -1
    18 0.65 0.16 1.37 -1
    将数据存为SVM.xls,代码如下:

    clc;
    clear all;
    X0=xlsread('SVM.xls','B2:E19');
    for i=1:3%%%训练样本的输入数据
       X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
    end
    [m,n]=size(X);
    e=ones(m,1);
    D=[X0(:,4)];%%%训练样本的输出
    B=zeros(m,m);
    for i=1:m
        B(i,i)=1;
        C(i,i)=D(i,1);
    end
    A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
    b=-e;
    f=[0,0,0,0,ones(1,m)];
    lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
    x=linprog(f,A,b,[],[],lb);
    W=[x(1,1),x(2,1),x(3,1)];
    CC=x(4,1);
    X1=[X(:,1),X(:,2),X(:,3)];
    R1=X1*W'-CC;
    R2=sign(R1);
    disp('程序输出结果为:');
    R=[R1,R2]
    虽然有很小误差但是可以接受。

    但是常见的并不是分为两类,比如葡萄酒那题分为4,5类怎么办(当然那题是无监督的,直接层次聚类或KEMANS就OK了)

    假如我有三类要划分,他们是A、B、C。

      于是我在抽取训练集的时候,分别抽取

      (1)A所对应的向量作为正集(为1),B,C所对应的向量作为负集(剩下的分为-1);

      (2)B所对应的向量作为正集,A,C所对应的向量作为负集;

      (3)C所对应的向量作为正集,A,B所对应的向量作为负集;

       使用这三个训练集分别进行训练,然后的得到三个训练结果文件。

      在测试的时候,把对应的测试向量分别利用这三个训练结果文件进行测试。

      最后每个测试都有一个结果f1(x),f2(x),f3(x).

      于是最终的结果便是这四个值中最大的一个作为分类结果。

    也就是说流程如下:

    1,将数据整理成三个xls

    2,对于第i个xls代表输入第i类的测试集,属于第i类的就标记结果为1,剩下的为-1.

    3,每一个均划分平面

    4,带入预测数据.

    5,对于每一个预测数据取最大的那个xls的值作为结果,也就是说它属于第i类。

    新的数据集如下:

    编号 资产折现力 盈利能力 活性 类别
    1 0.9 0.34 1.53 1
    2 0.88 0.23 1.67 1
    3 0.92 0.28 1.43 1
    4 0.89 0.14 1.24 1
    5 0.78 0.35 1.8 1
    6 0.81 0.26 2.01 1
    7 0.72 0.18 1.75 2
    8 0.93 0.22 0.99 2
    9 0.82 0.26 1.4 2
    10 0.78 0.26 1.34 2
    11 0.78 0.27 1.67 2
    12 0.72 0.18 1.53 2
    13 0.69 0.16 1.2 3
    14 0.63 0.15 0.88 3
    15 0.58 0.22 1.42 3
    16 0.81 0.18 1.59 3
    17 0.67 0.21 1.21 3
    18 0.65 0.16 1.37 3
    将数据处理后分别存入SVM2.xls,SVM3.xls,SVM4.xls

    代码如下:


    clc;
    clear all;
    X0=xlsread('SVM2.xls','B2:E19');
    for i=1:3%%%训练样本的输入数据
       X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
    end
    [m,n]=size(X);
    e=ones(m,1);
    D=[X0(:,4)];%%%训练样本的输出
    B=zeros(m,m);
    for i=1:m
        B(i,i)=1;
        C(i,i)=D(i,1);
    end
    A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
    b=-e;
    f=[0,0,0,0,ones(1,m)];
    lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
    x=linprog(f,A,b,[],[],lb);
    W=[x(1,1),x(2,1),x(3,1)];
    CC=x(4,1);
    X1=[X(:,1),X(:,2),X(:,3)];
    R1=X1*W'-CC;
    R=R1;
    

    %%%处理表二
    X0=xlsread(‘SVM3.xls’,‘B2:E19’);
    for i=1:3%%%训练样本的输入数据
    X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
    end
    [m,n]=size(X);
    e=ones(m,1);
    D=[X0(:,4)];%%%训练样本的输出
    B=zeros(m,m);
    for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
    end
    A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).D,D,-B];
    b=-e;
    f=[0,0,0,0,ones(1,m)];
    lb=[-inf,-inf,-inf,-inf,zeros(1,m)]’;
    x=linprog(f,A,b,[],[],lb);
    W=[x(1,1),x(2,1),x(3,1)];
    CC=x(4,1);
    X1=[X(:,1),X(:,2),X(:,3)];
    R1=X1
    W’-CC;
    R=[R,R1];

    %%%处理表三
    X0=xlsread(‘SVM4.xls’,‘B2:E19’);
    for i=1:3%%%训练样本的输入数据
    X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
    end
    [m,n]=size(X);
    e=ones(m,1);
    D=[X0(:,4)];%%%训练样本的输出
    B=zeros(m,m);
    for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
    end
    A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).D,D,-B];
    b=-e;
    f=[0,0,0,0,ones(1,m)];
    lb=[-inf,-inf,-inf,-inf,zeros(1,m)]’;
    x=linprog(f,A,b,[],[],lb);
    W=[x(1,1),x(2,1),x(3,1)];
    CC=x(4,1);
    X1=[X(:,1),X(:,2),X(:,3)];
    R1=X1
    W’-CC;
    R=[R,R1];
    for i=1:size(R,1)
    [c,d]=max(R(i,:));
    t(i,1)=c;
    t(i,2)=d;%%%判断属于哪一个类别
    end
    disp(‘输出结果为:’);
    t


    t =


       91.4813    1.0000

      105.2576    1.0000

       91.4428    1.0000

        5.0052    1.0000

       10.0521    1.0000

      105.9796    1.0000

       -0.7916    2.0000

        0.5677    2.0000

       -0.7547    2.0000

       -1.0000    3.0000

       -1.2244    2.0000

       -0.3183    3.0000

        1.1881    3.0000

        2.9200    3.0000

        1.2706    3.0000

       -0.0850    2.0000

        1.0000    3.0000

        1.1044    3.0000

    结果还不错~~



    展开全文
  • 分类SVMMatlab实现

    2019-04-12 09:31:15
    内含libsvm工具箱、SVMs的示例程序(含代码和实例数据)、SVR的示例程序(含代码和实例数据)
  • matlab利用hinge loss实现分类SVM

    千次阅读 多人点赞 2017-03-15 09:56:35
    介绍 hinge loss code1 介绍本文将介绍hinge loss E(w)E(w)以及其梯度∇E(w)\nabla E(w)。并利用批量梯度下降方法来优化hinge loss实现...根据二分类的SVM目标函数,我们可以定义分类的SVM目标函数: E(w1,…,wk)=∑

    1 介绍

    本文将介绍hinge loss E(w)以及其梯度E(w)。并利用批量梯度下降方法来优化hinge loss实现SVM多分类。利用hinge loss在手写字数据库上实验,能达到87.040%的正确识别率。


    2. hinge loss

    1. 根据二分类的SVM目标函数,我们可以定义多分类的SVM目标函数:
      E(w1,,wk)=kj=112||wj||2+Cni=1L((w1,,wk),(xi,yi)).

    其中T={(x1,y1),,(xn,yn)}为训练集。L((w1,,wk),(x,y))=max(0,maxyywTyx+1wTyx). 二分类SVM转化为多分类SVM的相关资料和公式推导可以参见其他文献。
    2. 接下介绍E(w)的梯度计算。
    (a) 如果 wTywTy^x+1, 那么

    L((w1,w2,,wk),(x,y))wj,l=0

    (b) 如果 wTy<wTy^x+1j=y, 那么

    L((w1,w2,,wk),(x,y))wj,l=xl

    (c) 如果 wTy<wTy^x+1j=y^, 那么

    L((w1,w2,,wk),(x,y))wj,l=xl

    (d) 如果 wTy<wTy^x+1jy and jy^, 那么

    L((w1,w2,,wk),(x,y))wj,l=0

    1. 利用梯度下降法更新W={w1,,wk}:
      Wt=Wt1rE(Wt1)

    3 code

    Muliticlass_svm.m

    % 作者:何凌霄
    % 中科院自动化所
    % 2017315
    clear all
    clc
    %% STEP 0: Initialise constants and parameters
    inputSize = 28 * 28; % Size of input vector (MNIST images are 28x28)
    numClasses = 10;     % Number of classes (MNIST images fall into 10 classes)
    lambda = 1e-2; % Weight decay parameter
    learning_rate = 0.1;
    iteration=400;
    %%======================================================================
    %% STEP 1: Load data
    load('digits.mat')
    images = [train1; train2; train3; train4; train5; train6; train7; train8; train9;train0];
    images = images';
    labels = [ones(500,1);2*ones(500,1);3*ones(500,1);4*ones(500,1);5*ones(500,1);6*ones(500,1);7*ones(500,1);8*ones(500,1);9*ones(500,1);10*ones(500,1)];
    index = randperm(500*10);
    images = images(:,index);
    labels = labels(index);
    inputData = images;
    %% STEP 2: Train multiclass svm
    [cost, grad, svmOptTheta] = multisvmtrain(numClasses, inputSize, lambda, inputData, labels, iteration, learning_rate);
    %% STEP 3: Test
    images = [test1; test2; test3; test4; test5; test6; test7; test8; test9;test0];
    images = images';
    labels = [ones(500,1);2*ones(500,1);3*ones(500,1);4*ones(500,1);5*ones(500,1);6*ones(500,1);7*ones(500,1);8*ones(500,1);9*ones(500,1);10*ones(500,1)];
    
    inputData = images;
    svmModel.optTheta = reshape(svmOptTheta, numClasses, inputSize);
    svmModel.inputSize = inputSize;
    svmModel.numClasses = numClasses;
    
    % You will have to implement softmaxPredict in softmaxPredict.m
    [pred] = Multi_SVMPredict(svmModel, inputData);
    acc = mean(labels(:) == pred(:));
    num_in_class = 500*ones(10,1)';
    for i=1:10
        name_class{i}=num2str(i);
    end
    [confusion_matrix]=compute_confusion_matrix(pred,num_in_class,name_class);
    figure; visualize(svmOptTheta');
    fprintf('Accuracy: %0.3f%%\n', acc * 100);
    

    multisvmtrain.m

    % 作者:何凌霄
    % 中科院自动化所
    % 2017年3月15
    function [lcost, grad, theta] = multisvmtrain(numClasses, inputSize, lambda, data, labels, iteration, learning_rate)
    theta = 0.005 * randn(numClasses * inputSize, 1);
    theta = reshape(theta, numClasses, inputSize);%将输入的参数列向量变成一个矩阵
    numCases = size(data, 2);%输入样本的个数
    groundTruth = full(sparse(labels, 1:numCases, 1));%这里sparse是生成一个稀疏矩阵,该矩阵中的值都是第三个值1
    cost = 0;
    thetagrad = zeros(numClasses, inputSize);
    for i = 1:iteration
        [Q, X, cost] = multi_hingeloss_cost(theta, data, groundTruth,lambda);
        [thetagrad] = multi_hingeloss_grad(data,theta, Q, groundTruth, lambda, labels);
        theta = theta - learning_rate*thetagrad;
        lcost(i) = cost;
        grad(i) = sum(sum(thetagrad));
        fprintf('%d, %f\n', i, cost);
    end
    end

    multi_hingeloss_cost.m

    % 作者:何凌霄
    % 中科院自动化所
    % 2017年3月15
    function [Q, X, cost] = multi_hingeloss_cost(theta, data, groundTruth,lambda)
    groundTruth1 = groundTruth;
    groundTruth(find(groundTruth==1)) = -inf;  
    groundTruth(find(groundTruth==0)) = 1; 
    X = theta*data;
    Q = X;
    Q = Q.*groundTruth;
    Q(find(Q==inf)) = -inf;
    temp = X.*groundTruth1;
    temp(find(temp==0))=[];
    t = max(0, 1 - temp + max(Q));
    cost = 1/size(data,2)*sum(t)+lambda*sum(theta(:).^2);

    multi_hingeloss_grad.m

    % 作者:何凌霄
    % 中科院自动化所
    % 2017年3月15
    function [thetagrad] = multi_hingeloss_grad(data, theta, Q, groundTruth, lambda, labels)
    X = theta*data;
    [~,q] = max(Q);
    Xq = full(sparse(q, 1:size(X,2), 1));
    if size(Xq,1)<10
        for i = 1:10-size(Xq,1)
            Xq = [Xq;zeros(1, size(Xq,2))];
        end
    end
    temp = X.*groundTruth;
    temp1 = X.*Xq;
    temp1(find(temp1==0))=[];
    temp(find(temp==0))=[];
    W=(temp - temp1)<1;
    Y = zeros(size(X));
    
    for i=1:size(X,2)
        Y(labels(i),i) = -W(i);
        Y(q(i),i) = W(i);
    end
    thetagrad = 1/size(X,2)*Y*data' + lambda * theta;

    Multi_SVMPredict.m

    % 作者:何凌霄
    % 中科院自动化所
    % 2017年3月15
    function [pred] = Multi_SVMPredict(svmModel, data)
    theta = svmModel.optTheta;  % this provides a numClasses x inputSize matrix
    pred = zeros(1, size(data, 2));
    [nop, pred] = max(theta * data);
    end

    compute_confusion_matrix.m

    [confusion_matrix]=compute_confusion_matrix(predict_label,num_in_class,name_class)%预测标签,每一类的数目,类别数目  
    %predict_label为一维行向量  
    %num_in_class代表每一类的个数  
    %name_class代表类名  
    num_class=length(num_in_class);  
    num_in_class=[0 num_in_class];  
    confusion_matrix=size(num_class,num_class);  
    
    for ci=1:num_class  
        for cj=1:num_class  
            summer=0;%统计对应标签个数  
            c_start=sum(num_in_class(1:ci))+1;  
            c_end=sum(num_in_class(1:ci+1));  
            summer=size(find(predict_label(c_start:c_end)==cj),2);  
            confusion_matrix(ci,cj)=summer/num_in_class(ci+1);  
        end  
    end  
    
    draw_cm(confusion_matrix,name_class,num_class);  
    
    end  

    function draw_cm.m

    function draw_cm(mat,tick,num_class)  
    
    imagesc(1:num_class,1:num_class,mat);            %# in color  
    colormap(flipud(gray));  %# for gray; black for large value.  
    
    textStrings = num2str(mat(:),'%0.2f');    
    textStrings = strtrim(cellstr(textStrings));   
    [x,y] = meshgrid(1:num_class);   
    hStrings = text(x(:),y(:),textStrings(:), 'HorizontalAlignment','center');  
    midValue = mean(get(gca,'CLim'));   
    textColors = repmat(mat(:) > midValue,1,3);   
    set(hStrings,{'Color'},num2cell(textColors,2));  %# Change the text colors  
    
    set(gca,'xticklabel',tick,'XAxisLocation','top');  
    set(gca, 'XTick', 1:num_class, 'YTick', 1:num_class);  
    set(gca,'yticklabel',tick);  
    rotateXLabels(gca, 315 );% rotate the x tick  

    visualize.m

    function r=visualize(X, mm, s1, s2)
    %FROM RBMLIB http://code.google.com/p/matrbm/
    %Visualize weights X. If the function is called as a void method,
    %it does the plotting. But if the function is assigned to a variable 
    %outside of this code, the formed image is returned instead.
    if ~exist('mm','var')
        mm = [min(X(:)) max(X(:))];
    end
    if ~exist('s1','var')
        s1 = 0;
    end
    if ~exist('s2','var')
        s2 = 0;
    end
    
    [D,N]= size(X);
    s=sqrt(D);
    if s==floor(s) || (s1 ~=0 && s2 ~=0)
        if (s1 ==0 || s2 ==0)
            s1 = s; s2 = s;
        end
        %its a square, so data is probably an image
        num=ceil(sqrt(N));
        a=mm(2)*ones(num*s2+num-1,num*s1+num-1);
        x=0;
        y=0;
        for i=1:N
            im = reshape(X(:,i),s1,s2)';
            a(x*s2+1+x : x*s2+s2+x, y*s1+1+y : y*s1+s1+y)=im;
            x=x+1;
            if(x>=num)
                x=0;
                y=y+1;
            end
        end
        d=true;
    else
        %there is not much we can do
        a=X;
    end
    
    %return the image, or plot the image
    if nargout==1
        r=a;
    else
    
        imagesc(a, [mm(1) mm(2)]);
        axis equal
        colormap gray
    
    end
    

    得到的识别率为87.040%,hinge loss可以和任何深度网络结合完成分类任务。
    最后得到的混淆矩阵如下:
    这里写图片描述

    损失函数图像:
    这里写图片描述

    数据集见资源,如引用此代码,请注明出处。

    展开全文
  • 经典SVM算法多类分类matlab程序

    千次下载 热门讨论 2013-07-17 14:17:58
    经典SVM算法多类分类 matlab程序
  • svm多分类matlab程序

    2015-04-13 16:44:15
    svm多分类matlab程序,包括一对一、一对余等二叉树分类算法
  • MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm

    万次阅读 多人点赞 2019-07-18 13:56:09
    MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvmSVM分类一对一(one-vs-one)一对(one-vs-rest)fitcsvm简单介绍代码实验结果图第一次写博客,还请大家多多包涵,欢迎指教! SVM多分类 SVM也叫支持...
  • 今天需要做一个用SVM实现分类的程序,鉴于本人是matlab初学者,所以了解一些matlab的基本常识是很重要的。下面是在MATLAB编辑器(Editor)中一些快捷键的用法: 1)【Tab】(或【Ctrl+]】)――增加缩进(对多行...
  • svm多分类 matlab程序

    热门讨论 2014-08-22 16:23:03
    采用matlab自带的svmtrain和svmpredict实现分类。
  • libsvm - 支持类别分类的svm工具箱(matlab). 它扩展了matlab自带的svm分类器的功能(只能完成2分类),可配合DeepLearnToolbox使用
  • matlab脑电波有正常信号与疲劳信号,通过构建svm分类器,进行SVM分类
  • svsvm分类matlab程序.rar

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

matlab多类svm

matlab 订阅