多分类SVM支持向量机的matlab仿真

2023-11-18

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

    支持向量机(Support Vector Machine,SVM) 是一种在统计学习基础上发展起来的机器学习方法,其最大特点是根据Vapnik结构风险最小化原则。它的基本模型是定义在特征空间上的间隔最大的线性分类器,在解决小样本、非线性及高维度等问题上具有传统的机器学习方法所不具备的优势。SVM本是针对二分类问题提出的,如何将其应用到多类分类问题将成为对SVM研究的重要问题之一。当前,对于SVM的多分类问题,解决思路有两种:(1)将问题转化为SVM直接可解的问题;(2)适当改变原始SVM中最优化问题,使之成为能同时计算出所有分类决策问题的决策函数,从而一次性实现多分类。其中方法(2)看似简单,但由于其问题最优化求解过程太过复杂,计算量太大,实现困难,未得到广泛应用。故当前多分类主要采用的是方法(1)的思想。

       支持向量机(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被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用 。
SVM是由模式识别中广义肖像算法(generalized portrait algorithm)发展而来的分类器 ,其早期工作来自前苏联学者Vladimir N. Vapnik和Alexander Y. Lerner在1963年发表的研究 。1964年,Vapnik和Alexey Y. Chervonenkis对广义肖像算法进行了进一步讨论并建立了硬边距的线性SVM [7]  。此后在二十世纪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在各领域的应用提供了参考。

        所谓向量,可以简单理解成在直角坐标系中由原点出发,指向某一坐标点的一个剪头,因此它只有两个特征,大小和方向,如下图(以二维空间为例)中x \boldsymbol xx。所谓n nn维超平面(hyperplane)是指在n nn维内积空间中,所有在同一个法向量(如下图中w \boldsymbol ww)上投影长度相同的向量组成的集合,如下图中超平面。

在这里插入图片描述

 

       由此可见,超平面外一向量到超平面的几何距离就等于将该向量代入超平面方程取绝对值后,再除以超平面法向量的模长。 

  总的来说,在集成算法和神经网络风靡之前,SVM 基本上是最好的分类算法,但即使在今天,它依然占有较高的地位。

  SVM 的主要优点有:

  1)引入最大间隔,分类精确度高

  2)在样本量较小时,也能准确的分类,并且具有不错的泛化能力

  3)引入核函数,能轻松的解决非线性问题

  4)能解决高维特征的分类、回归问题,即使特征维度大于样本的数据,也能有很好的表现

  SVM 的主要缺点有:

  1)在样本量非常大时,核函数中內积的计算,求解拉格朗日乘子α 值的计算都是和样本个数有关的,会导致在求解模型时的计算量过大

  2)核函数的选择通常没有明确的指导,有时候难以选择一个合适的核函数,而且像多项式核函数,需要调试的参数也非常多

二分类:

多分类

 

二、核心程序

.............................................................

figure;
subplot(131);
for i = 1:Class_Num
    %测试数据设置为1维,2维,或者3维,多维测试数据不方便观察
    Nums= 10+round(Num*rand(1))+1;
    Xo  = 3*floor((i+1)/2) + randn(1,Nums);
    Yo  = 3*mod(i,2)       + randn(1,Nums);
    Lo  = i*ones(1,Nums);
    Xt  = [Xt,Xo];
    Yt  = [Yt,Yo];  
    Lt  = [Lt,Lo];
    plot(Xo,Yo,colors{1});
    hold on;
end
title('原始数据');  
Test_Dat = [Xt;Yt]; 
Category = Lt;
axis square;
Len_xy   = axis;
axis([Len_xy(1),Len_xy(2),Len_xy(3),Len_xy(4)]);

subplot(132);
func_MSVM_old(Test_Dat,Category,Class_Num,colors,Len_xy);


 
%%newmsvm
%%newmsvm
%%newmsvm
%根据MSVM论文的算法进行多分类SVM仿真
%进行训练
Parameter.solver ='Operation';
Parameter.ker    ='linear';
Parameter.arg    = 1;
Parameter.C      = 1;
[dim,num_data]   = size(Test_Dat);
CNT              = 0;
Category_Index   = [];
Classes          = zeros(2,(Class_Num-1)*Class_Num/2);
Alpha            = zeros(num_data,(Class_Num-1)*Class_Num/2);
b                = zeros((Class_Num-1)*Class_Num/2,1);
K                = 0;

Test_Dat1        = Test_Dat;
Test_Dat2        = Test_Dat.^2;
Test_Dat3        = [Test_Dat(1,:).*Test_Dat(2,:);Test_Dat(1,:).*Test_Dat(2,:)];
bin_model        = [];
Alpha1           = zeros(num_data,(Class_Num-1)*Class_Num/2);
b1               = zeros((Class_Num-1)*Class_Num/2,1);
K1               = 0;
for j1 = 1:Class_Num-1
    for j2 = j1+1:Class_Num
        CNT = CNT + 1
        %dual form
        Classes(1,CNT) = j1;
        Classes(2,CNT) = j2;
        Category_Index1= find(Category==j1);
        Category_Index2= find(Category==j2);
        Category_Index = unique([Category_Index1,Category_Index2]);
        bin_data.X     = Test_Dat1(:,Category_Index);
        bin_data.y     = Category(:,Category_Index);
        bin_data.y(find(bin_data.y == j1)) = 1;
        bin_data.y(find(bin_data.y == j2)) = 2;
        bin_model      = feval('Operation',bin_data,Parameter);
        %计算alpha
        Alpha1(Category_Index(bin_model.POS.inx),CNT) = bin_model.Alpha(:);
        %计算b
        b1(CNT) = bin_model.b;
        %计算K
        K1      = K1 + bin_model.K;
    end
end
bin_model        = [];
CNT              = 0;
Category_Index   = [];
Alpha2           = zeros(num_data,(Class_Num-1)*Class_Num/2);
b2               = zeros((Class_Num-1)*Class_Num/2,1);
K2               = 0;
for j1 = 1:Class_Num-1
    for j2 = j1+1:Class_Num
        CNT = CNT + 1
        %dual form
        Classes(1,CNT) = j1;
        Classes(2,CNT) = j2;
        Category_Index1= find(Category==j1);
        Category_Index2= find(Category==j2);
        Category_Index = unique([Category_Index1,Category_Index2]);
        bin_data.X     = Test_Dat2(:,Category_Index);
        bin_data.y     = Category(:,Category_Index);
        bin_data.y(find(bin_data.y == j1)) = 1;
        bin_data.y(find(bin_data.y == j2)) = 2;
        bin_model      = feval('Operation',bin_data,Parameter);
        %计算alpha
        Alpha2(Category_Index(bin_model.POS.inx),CNT) = bin_model.Alpha(:);
        %计算b
        b2(CNT) = bin_model.b;
        %计算K
        K2     = K2 + bin_model.K;
    end
end
bin_model        = [];
CNT              = 0;
Category_Index   = [];
Alpha3           = zeros(num_data,(Class_Num-1)*Class_Num/2);
b3               = zeros((Class_Num-1)*Class_Num/2,1);
K3               = 0;
for j1 = 1:Class_Num-1
    for j2 = j1+1:Class_Num
        CNT = CNT + 1
        %dual form
        Classes(1,CNT) = j1;
        Classes(2,CNT) = j2;
        Category_Index1= find(Category==j1);
        Category_Index2= find(Category==j2);
        Category_Index = unique([Category_Index1,Category_Index2]);
        bin_data.X     = Test_Dat3(:,Category_Index);
        bin_data.y     = Category(:,Category_Index);
        bin_data.y(find(bin_data.y == j1)) = 1;
        bin_data.y(find(bin_data.y == j2)) = 2;
        bin_model      = feval('Operation',bin_data,Parameter);
        %计算alpha
        Alpha3(Category_Index(bin_model.POS.inx),CNT) = bin_model.Alpha(:);
        %计算b
        b3(CNT) = bin_model.b;
        %计算K
        K3      = K3 + bin_model.K;
    end
end

Alphao{1} = Alpha1;
Alphao{2} = Alpha2;
Alphao{3} = Alpha3;
bo{1}     = b1;
bo{2}     = b2;
bo{3}     = b3;
Ko{1}     = K1;
Ko{2}     = K2;
Ko{3}     = K3;

[V,I] = min([K1(1),K2(1),K3(1)]);
K     = Ko{I};

Alpha = Alphao{I};
b     = bo{I};



index0             = find(sum(abs(Alpha),2)~= 0);
MSVM_Net.Alpha     = Alpha(index0,:);
MSVM_Net.b         = b;
MSVM_Net.Classes   = Classes;
MSVM_Net.Pos.X     = Test_Dat(:,index0);
MSVM_Net.Pos.y     = Category(index0);
MSVM_Net.K         = K;
MSVM_Net.Parameter = Parameter;
 
subplot(133);
DIM = size(Test_Dat,1);
for Class_Ind = 1:Class_Num
    Index = find(Category == Class_Ind);
    if isempty(Index)==0
       if DIM == 1
          h = plot(Test_Dat(1,Index),zeros(1,length(Index)),colors{Class_Ind});
       end
       if DIM == 2
          h = plot(Test_Dat(1,Index),Test_Dat(2,Index),colors{Class_Ind});
       end
       if DIM >= 3
          h = plot3(Test_Dat(1,Index),Test_Dat(2,Index),Test_Dat(3,Index),colors{Class_Ind});
       end
    end
    hold on;
end

dx        = 0.1;
dy        = 0.1;
Xgrid     = Len_xy(1):dx:Len_xy(2);
Ygrid     = Len_xy(3):dy:Len_xy(4);
[X,Y]     = meshgrid(Xgrid,Ygrid);

Xmulti    = 1;
Ymulti    = 1;
for j = 1:DIM
    Xmulti = Xmulti*size(X,j);
    Ymulti = Ymulti*size(Y,j);
end         
View_data = [reshape(X',1,Xmulti);
             reshape(Y',1,Ymulti)];     
         
MSVM_     = feval('msvmclassify',View_data,MSVM_Net);

%计算分类错误概率
Ini_Class = Category;
Label_test= msvmclassify(Test_Dat,MSVM_Net);
Label_init= Ini_Class;
Error     = length(find((Label_test-Label_init)~=0))/length(Label_test);
Dats      = num2str(100*Error);

func_get_boudary(MSVM_,Class_Num,Xgrid,Ygrid);
title(['错误比例:',Dats,'%']);  
axis square;
axis([Len_xy(1),Len_xy(2),Len_xy(3),Len_xy(4)]);

clc;
clear;
A05-15

三、仿真结论

二分类:

三分类:

四分类:

五分类:

 六分类:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多分类SVM支持向量机的matlab仿真 的相关文章

  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt

随机推荐

  • wired xdisplay只能复制无法拓展

    我出现的问题是ipad可以复制屏幕 但是在系统显示设置中却没有显示有第二块屏幕 如果显示有第二块屏幕 直接win p调成拓展就可以解决了 如果出现的问题和我一样 可以按下面步骤解决 1 ipad和桌面端连接 2 PC端xDisplay 高级
  • 微软和Facebook推出Docs.com

    来源 德胜网 4月22日 据国外媒体报道 Facebook和微软在联手一项在线文件共享服务 看起来多一点像Google Docs 周三在Facebook的F8会议Docs com上线 该网站允许Facebook用户使用Facebook连接登
  • 2.虚拟机CentOS7.6安装SOA

    1 安装JDK8 1 1检查是否自带OpenJDK rpm qa grep jdk 卸载openjdk sudo yum y remove java openjdk 验证是否卸载了openjdk 1 2上传安装包 解压安装包 tar zxv
  • Seata源码分析——@GlobalTransactional

    Seata源码分析 GlobalTransactional 前言 脑图 Seata三大角色 GlobalTransactional 源码入口 GlobalTransactionScanner 初始化TM RM wrapIfNecessary
  • 软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

    软考 中级软件设计师 多媒体基础 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域知识 要熟
  • 第24讲 Python 复数数据类型详解(complex)

    您的 关注 和 点赞 是认可 是支持 是动力 如意见相佐 可留言 本人必将竭尽全力试图做到准确和全面 终其一生进行修改补充更新 本文首发在IT羊资源网 IT羊资源网 网址 https www ityangzy com IT羊资源网是IT世界
  • 我30岁了,转行学编程可以吗? 排除法告诉你答案 ...

    我30岁了 转行学编程可以吗 排除法告诉你答案 白月黑羽网站的读者在群里问过好几次 这个问题 但是这个问题太笼统了 其实不好回答 白月黑羽的这篇博客将根据的你的自身状况 不断的添加 自身条件的假设 采用排除法 认真的回答这个问题 既然有 转
  • ImageJ按照Little-Endian格式存储raw文件

    opencv图像处理是针对little endian数据 多帧堆叠情况下 否则结果错误 下面介绍如何用imageJ存储raw 参考 https imagej nih gov ij docs menus file html 1 在ImageJ
  • 毕设 STM32的FRID高速收费系统(源码+硬件+论文)

    文章目录 0 前言 1 主要功能 2 系统架构 3 硬件设计原理图 4 软件设计流程 称重模块HX711模块子流程 步进电机子流程 5 关键代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和
  • Python库这么多,如何记住呢?

    大家不要着急去收藏Python库 了解python的一些常用库就可以了 具体学到什么方向可以找个项目直接做 过程中接触到什么库再去学 下面给大家介绍几种查找Python库的方法 一 查看官方文档 要知道有哪些 大家可以查看官方文档 比如常用
  • 关键字static的理解

    1 概念 像在VB C C C Java PHP Objective C JavaScript中我们可以看到static作为关键字和函数出现 在其他的高级计算机语言如FORTRAN ALGOL COBOL BASIC LISP SNOBOL
  • Kotlin - 文件类 File

    文件操作 遍历 walk 自上而下 深度优先 遍历整个文件夹 walkBottomUp 自下而上的顺序遍历文件目录和内容 walkTopDown 自上而下的顺序遍历文件目录和内容 名称 extension 文件名的后缀格式 不包含 例如 m
  • [激光原理与应用-45]:《焊接质量检测》-2- 常见焊接缺陷与检验方法

    目录 一 概述 二 焊接缺陷的分类 2 1 按产生原因 2 2 按性质分有 2 3 按在焊缝中的位置分有 三 焊接缺陷检验的常用方法 一 概述 对于一个金属结构来说 焊接检验就是对所有焊缝或焊接接头而言的 也就是对焊接缺陷的检验 但焊接接头
  • idea 编译成功启动失败

    环境 Windows10 IntelliJ IDEA 2021 2 3 Ultimate Edition Apache Maven 3 8 3 SpringBoot版本 2 1 13 RELEASE 问题描述 SpringBoot项目启动时
  • html输入浮点型,input框限定输入值为浮点型代码分享

    本文主要为大家带来一篇对于input 框限定输入值为浮点型的js代码 小编觉得挺不错的 现在就分享给大家 也给大家做个参考 一起跟随小编过来看看吧 希望能帮助到大家 在一些项目中 比如金额用到浮点型 对于input 限定可以参考以下 fun
  • 信创-大数据平台CPU架构支持

    一 CDH和HDP CDP CDP数据中心类似于CDH和HDP 直接安装在硬件服务器上 目前支持市面上主流的X86服务器 包括国内海光服务器 CDH不支持ARM 以上两种大数据平台都仅支持x86架构 早在几年期RedHat联手clouder
  • IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)

    自动代码 常用的有fori sout psvm Tab即可生成循环 System out main方法等boilerplate样板代码 例如要输入for User user users 只需输入user for Tab 再比如 要输入Dat
  • SQL BOY 4 款脚本工具利器

    对于正在运行的mysql 性能如何 参数设置的是否合理 账号设置的是否存在安全隐患 你是否了然于胸 俗话说工欲善其事 必先利其器 定期对你的MYSQL数据库进行一个体检 是保证数据库安全运行的重要手段 今天和大家分享几个mysql 优化的工
  • Java多线程工具类之循环栅栏计数器

    Java多线程下循环计数器 本文主要内容 CyclicBarrier 下文中凯哥就用cycBar来代替 定义介绍 举例说明 代码演示 从源码来看原理及总结 CyclicBarrier与CountDownLatch 下文就用CountDown
  • 多分类SVM支持向量机的matlab仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 支持向量机 Support Vector Machine SVM 是一种在统计学习基础上发展起来的机器学习方法 其最大特点是根据Vapnik结构风险最小化原则 它的基本模型是定义