草庐IT

利用支持向量机(SVM)进行分类的Matlab实现

三年500篇 2023-05-18 原文

文章目录


前言

 看到目前博客上的支持向量机的matlab代码都是从底层原理开始编起,这对单纯想使用支持向量机实现一个简单的分类的人来说十分不友好,其实matlab内已有封装好的支持向量机代码,本文简单记录一下如何使用。


一、支持向量机是什么?

 对于一个二分类任务来说,支持向量机的目的是寻找一个最优超平面,使得样本在超平面的两侧,在边界(图中虚线)上的样本被叫做支持向量。

 那么要想实现一个分类任务,支持向量机的输入和输出分别是什么呢?作为一种监督学习的算法,每个样本肯定要有标签,也就是该样本到底是哪一类;要进行分类,那每个样本都要有自己的特征,当然这个特征可以有很多个,所以SVM的输入是特征矩阵以及类标签。

二、步骤

1.构建特征矩阵和类标签

这里以matlab中的鸢尾花数据集为例进行说明,load fisheriris导入鸢尾花数据集,导入的变量有meas和species两个,其中meas是150*4的矩阵,表示有150个样本,每个样本有4个特征;species是一个元胞数组,存放的是鸢尾花的类型,有’setosa’,'versicolor’和’virginica’三类鸢尾花, 由于本文实现二分类,故把第三类virginica删除。

load fisheriris  %加载鸢尾花数据集
meas(101:150,:)=[];  %删除virginica类
species(101:150,:)=[];

2.使用fitcsvm函数训练svm

上一步中已经构造好了样本的特征矩阵和样本的标签,使用fitcsvm函数可以训练支持向量机模型。

SVMModel = fitcsvm(meas,species)

下图是训练好的支持向量机

3.使用predict函数验证svm

使用predict函数可以检验svm的准确性,选择90%的样本用于训练,10%的样本用于测试。

CVSVMModel = fitcsvm(meas,species,'Holdout',0.1); %随机选择10%的样本用于测试
CompactSVMModel = CVSVMModel.Trained{1}; 
testInds = test(CVSVMModel.Partition);   % 提取那10%用于测试的部分的下标
dataTest = meas(testInds,:);   % 提取那10%用于测试的部分的数据集
labelTest = species(testInds,:); % 提取那10%用于测试的部分的标签
label_predict = predict(CompactSVMModel,dataTest); 

label_predict中存放的便是预测结果,可以与labelTest进行比较,检验预测结果的正确性。
可以用表格的方式进行可视化

table(labelTest,label_predict,score(:,2),'VariableNames',...
    {'TrueLabel','PredictedLabel','Score'})

结果如下:

可以看到,对于测试集的所有样本,分类均是正确的。

4.完整代码

clc
clear
load fisheriris
meas(101:150,:)=[];
species(101:150,:)=[];
CVSVMModel = fitcsvm(meas,species,'Holdout',0.1); %随机选择10%的样本用于测试
CompactSVMModel = CVSVMModel.Trained{1}; 
testInds = test(CVSVMModel.Partition);   % 提取那10%用于测试的部分的下标
dataTest = meas(testInds,:);   % 提取那10%用于测试的部分的数据集
labelTest = species(testInds,:); % 提取那10%用于测试的部分的标签
label_predict = predict(CompactSVMModel,dataTest); 
table(labelTest,label_predict,'VariableNames',...
    {'TrueLabel','PredictedLabel'})

总结

本文利用matlab自带的函数实现了一个简单的SVM二分类问题,更多内容,可以在命令行中输入doc svm,打开帮助文档进行学习。

有关利用支持向量机(SVM)进行分类的Matlab实现的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐