如何使用libsvm进行分类

 
这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述。

其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。

那神马是属性矩阵?神马又是标签呢?我举一个直白的不能在直白的例子:
说一个班级里面有两个男生(男生1、男生2),两个女生(女生1、女生2),其中

男生1 身高:176cm 体重:70kg;
男生2 身高:180cm 体重:80kg;

女生1 身高:161cm 体重:45kg;
女生2 身高:163cm 体重:47kg;

如果我们将男生定义为1,女生定义为-1,并将上面的数据放入矩阵data中,即

  1. data = [176 70;
  2. 180 80;
  3. 161 45;
  4. 163 47];

复制代码

在label中存入男女生类别标签(1、-1),即

  1. label = [1;1;-1;-1];

复制代码

这样上面的data矩阵就是一个属性矩阵,行数4代表有4个样本,列数2表示属性有两个,label就是标签(1、-1表示有两个类别:男生、女生)。

Remark:这里有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
上面我们将男生定义为1,女生定义为-1,那定义成别的有影响吗?
这个肯定没有影响啊!(
用脚趾头都能想出来,我不知道为什么也会有人问),这里面的标签定义就是区分开男生和女生,怎么定义都可以的,只要定义成数值型的就可以。
比如我可将将男生定义为2,女生定义为5;后面的label相应为label=[2;2;5;5];
比如我可将将男生定义为18,女生定义为22;后面的label相应为label=[18;18;22;22];

为什么我说这个用脚趾头都能想怎么定义都可以呢?学过数学的应该都会明白,将男生定义为1,女生定义为-1和将男生定义为2,女生定义为5本质是一样的,应为可以找到一个映射将(2,5)转换成(1,-1),so所以本质都是一样的,后面的18、22本质也是一样的。
这里要多说一些,如果你原本的数据集合的标签不是数值型的(比如a、b、c)那么你完全可以通过某种转换映射将不是数值型的标签转换成数值型的。

现在回归正题,有了上面的属性矩阵data,和标签label就可以利用libsvm建立分类模型了,简要代码如下:

  1. model = svmtrain(label,data);

复制代码

有了model我们就可以做分类预测,比如此时该班级又转来一个新学生,其
身高190cm,体重85kg
我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)
比如 令 testdata = [190 85]; 由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)

Remark:这里又有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
如果测试集合的标签没有怎么办?测试集合的标签就应该没有,否则测试集合的标签都有了,还预测你妹啊!?没有是正确的,就像上面一样,新来的学生其标签咱不应知道,就想通过其属性矩阵来预测其标签,这才是预测分类的真正目的。
之所以平时做测试时,测试集合的标签一般都有,那是因为一般人们想要看看自己的分类器的效果如何,效果的评价指标之一就是分类预测的准确率,这就需要有测试集的本来的真实的标签来进行分类预测准确率的计算。

话归正传,即
testdatalabel = -1;

然后利用libsvm来预测这个新来的学生是男生还是女生,代码如下:

  1. [predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model)

复制代码

下面我们整体运行一下上面这段恶 搞[e gao]的背景数据和代码(你别笑,这个是真能运行的,也有结果的):

  1. data = [176 70;
  2. 180 80;
  3. 161 45;
  4. 163 47];
  5. label = [1;1;-1;-1];
  6. model = svmtrain(label,data);
  7. testdata = [190 85];
  8. testdatalabel = -1;
  9. [predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model);
  10. predictlabel

复制代码

运行结果如下:

  1. Accuracy = 0% (0/1) (classification)
  2. predictlabel =
  3. 1

复制代码

哎,我们看到,通过预测我们得知这个新来的学生的标签是1(男生),由于原本我们假设其标签为-1,假设错误,所以分类准确率为0%。

好,通过上面的讲解,不知道诸位看官对于利用libsvm进行分类是否有了一定了解【谁要是这么通俗的例子还搞不清楚怎么使用libsvm进行分类,那我真无语啦】,下面使用libsvm工具箱本身带的测试数据heart_scale来实际进行一下测试:

  1. %% HowToClassifyUsingLibsvm
  2. % by faruto @ faruto's Studio~
  3. % http://blog.sina.com.cn/faruto
  4. % Email:faruto@163.com
  5. % http://www.matlabsky.com
  6. % http://www.mfun.la
  7. % http://video.ourmatlab.com
  8. % last modified by 2010.12.27
  9. %% a litte clean work
  10. tic;
  11. close all;
  12. clear;
  13. clc;
  14. format compact;
  15. %%
  16. % 首先载入数据
  17. load heart_scale;
  18. data = heart_scale_inst;
  19. label = heart_scale_label;
  20. % 选取前200个数据作为训练集合,后70个数据作为测试集合
  21. ind = 200;
  22. traindata = data(1:ind,:);
  23. trainlabel = label(1:ind,:);
  24. testdata = data(ind+1:end,:);
  25. testlabel = label(ind+1:end,:);
  26. % 利用训练集合建立分类模型
  27. model = svmtrain(trainlabel,traindata,'-s 0 -t 2 -c 1.2 -g 2.8');
  28. % 分类模型model解密
  29. model
  30. Parameters = model.Parameters
  31. Label = model.Label
  32. nr_class = model.nr_class
  33. totalSV = model.totalSV
  34. nSV = model.nSV
  35. % 利用建立的模型看其在训练集合上的分类效果
  36. [ptrain,acctrain] = svmpredict(trainlabel,traindata,model);
  37. % 预测测试集合标签
  38. [ptest,acctest] = svmpredict(testlabel,testdata,model);
  39. %%
  40. toc;

复制代码

运行结果:

  1. model =
  2. Parameters: [5x1 double]
  3. nr_class: 2
  4. totalSV: 197
  5. rho: 0.0583
  6. Label: [2x1 double]
  7. ProbA: []
  8. ProbB: []
  9. nSV: [2x1 double]
  10. sv_coef: [197x1 double]
  11. SVs: [197x13 double]
  12. Parameters =
  13. 0
  14. 2.0000
  15. 3.0000
  16. 2.8000
  17. 0
  18. Label =
  19. 1
  20. -1
  21. nr_class =
  22. 2
  23. totalSV =
  24. 197
  25. nSV =
  26. 89
  27. 108
  28. Accuracy = 99.5% (199/200) (classification)
  29. Accuracy = 68.5714% (48/70) (classification)
  30. Elapsed time is 0.040873 seconds.
  31. >>

复制代码

上面的代码基本我不想多说什么。
只是说一下参数输入的意义:

  -s svm类型:SVM设置类型(默认0)
  0 -- C-SVC
  1 --v-SVC
  2 – 一类SVM
  3 -- e -SVR
  4 -- v-SVR
  -t 核函数类型:核函数设置类型(默认2)
  0 – 线性:u'v
  1 – 多项式:(r*u'v + coef0)^degree
  2 – RBF函数:exp(-r|u-v|^2)
  3 –sigmoid:tanh(r*u'v + coef0)

-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)

-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)

更多关于libsvm 参数的说明请看
libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/thread-12380-1-1.html

还有关于建立的分类模型model

  1. model =
  2. Parameters: [5x1 double]
  3. nr_class: 2
  4. totalSV: 197
  5. rho: 0.0583
  6. Label: [2x1 double]
  7. ProbA: []
  8. ProbB: []
  9. nSV: [2x1 double]
  10. sv_coef: [197x1 double]
  11. SVs: [197x13 double]

复制代码

因为好多朋友反映说,比如想得到支持向量,还有model中的一些参看看不懂等等等等一些列问题,会在后面的
分类模型model解密详解中说明

利用libsvm-mat建立分类模型model参数解密【by faruto】

http://www.matlabsky.com/thread-12649-1-1.html

所以也希望诸位看官尤其是对svm感兴趣的朋友多多关注我。O(∩_∩)O~

如果对于标签设置问题您还没有搞懂可以再看看这个:
【转】Matlab中使用libsvm进行分类预测时的标签问题再次说明
http://www.matlabsky.com/thread-12396-1-1.html

更多关于SVM的东西请看:

关于SVM的那点破事[长期更新整理 by faruto]
http://www.matlabsky.com/thread-10966-1-1.html

svm 简单明了的入门级使用教程(转载)的更多相关文章

  1. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  2. IDEA入门级使用教程

    原文链接:https://blog.csdn.net/qq_31655965/article/details/52788374 最智能的IDE IDEA相对于eclipse来说最大的优点就是它比ecl ...

  3. MVC5 + EF6 入门完整教程(转载)--01

    MVC5 + EF6 入门完整教程   第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定&qu ...

  4. XCube和X组件的入门级使用教程

    我也是一个入门级的初学者,在学习魔方的时候,很多不是很懂的地方,而网上的资料又比较少.尤其是Newlife的论坛打不开的情况下 所以就想着把这个初级项目做完后,做一个入门级教程.保证人人都看得懂(.^ ...

  5. IDEA入门级使用教程----你怎么还在用eclipse?

    http://blog.csdn.net/qq_31655965/article/details/52788374

  6. 数据挖掘入门系列教程(九)之基于sklearn的SVM使用

    目录 介绍 基于SVM对MINIST数据集进行分类 使用SVM SVM分析垃圾邮件 加载数据集 分词 构建词云 构建数据集 进行训练 交叉验证 炼丹术 总结 参考 介绍 在上一篇博客:数据挖掘入门系列 ...

  7. 超简单!pytorch入门教程(五):训练和测试CNN

    我们按照超简单!pytorch入门教程(四):准备图片数据集准备好了图片数据以后,就来训练一下识别这10类图片的cnn神经网络吧. 按照超简单!pytorch入门教程(三):构造一个小型CNN构建好一 ...

  8. ❤️这应该是Postman最详细的中文使用教程了❤️(新手使用,简单明了)

    ️这应该是Postman最详细的中文使用教程了️(新手使用,简单明了) 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进 ...

  9. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

随机推荐

  1. @Qualifier is not applicable for constructor

    问题场景: 笔者在springboot项目中使用java_websocket作为客户端,调用第三方ws服务. 最初只调用一个ws服务,以下代码可以正常工作: @Bean public URI ttsU ...

  2. 将任意音频格式文件转换成16K采样率16bit的wav文件

    此转换需要使用ffmpeg 假设有目录 d:\录音 目录有 张三.m4a, 李四.m4a xxx.m4a(其他任意格式音频触类旁通可以把 *.m4a改成*.*).批量转换成采样率16K,有符号,16b ...

  3. thymeleaf自定义属性

    例如我想给添加一个属性data-page,可以根据(SpringEL/Ognl)表达式计算获得. 需求: 期望效果 app个数大于0,有数据时链接 <xxx data-page="/a ...

  4. Kafka——副本(Replica)机制

    副本定义 Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区.副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本. 所谓副本(Replica),本质就是一个只能追加写消息的提交 ...

  5. iOS通知注意点

    之前以为控制器发送通知,只有你满足:1>注册接收通知:2>进入本页面才能接收到值. 今天朋友问了一个问题: 他的逻辑如下: 退出登录发送通知,需要好几个界面会收到通知,然后这几个界面进行网 ...

  6. iOS-CGAffineTransform相关函数

    CGAffineTransform相关函数 CGAffineTransformMakeTranslation(width, 0.0);是改变位置的,CGAffineTransformRotate(tr ...

  7. 最新 拉卡拉java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.拉卡拉等10家互联网公司的校招Offer,因为某些自身原因最终选择了拉卡拉.6.7月主要是做系统复习.项目复盘.LeetCo ...

  8. 关于iframe的一些使用

    在iframe页面,获取当前iframe的id var iframeId = window.frameElement.id.toString(); 获取父窗口中另一个iframe的iframe,注意返 ...

  9. nginx之配置proxy_set_header问题梳理

    客户端请求web服务,客户端:ip:192.168.223.1 nginx作为反向代理服务器:192.168.223.136 nginx作为后端web服务器:192.168.223.137 前提条件: ...

  10. c# sqlite 导入,升级

    导入sqlite库 1.下载nupkg 安装包 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 记得.net ...