问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用libsvm进行分类20

发布网友 发布时间:2023-11-16 04:53

我来回答

1个回答

热心网友 时间:2024-12-12 20:31

  这帖子就是初步教教刚接触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中,即

  data = [176 70;

  180 80;

  161 45;

  163 47];

  复制代码
  在label中存入男女生类别标签(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建立分类模型了,简要代码如下:

  model = svmtrain(label,data);

  复制代码
  有了model我们就可以做分类预测,比如此时该班级又转来一个新学生,其
身高190cm,体重85kg
我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)
比如 令 testdata = [190 85]; 由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)
Remark:这里又有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
如果测试集合的标签没有怎么办?测试集合的标签就应该没有,否则测试集合的标签都有了,还预测你妹啊!?没有是正确的,就像上面一样,新来的学生其标签咱不应知道,就想通过其属性矩阵来预测其标签,这才是预测分类的真正目的。
之所以平时做测试时,测试集合的标签一般都有,那是因为一般人们想要看看自己的分类器的效果如何,效果的评价指标之一就是分类预测的准确率,这就需要有测试集的本来的真实的标签来进行分类预测准确率的计算。

话归正传,即
testdatalabel = -1;

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

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

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

  data = [176 70;

  180 80;

  161 45;

  163 47];

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

  model = svmtrain(label,data);

  testdata = [190 85];

  testdatalabel = -1;

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

  predictlabel

  复制代码
  运行结果如下:

  Accuracy = 0% (0/1) (classification)

  predictlabel =

  1

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

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

  % by faruto @ faruto's Studio~

  % http://blog.sina.com.cn/faruto

  % Email:faruto@163.com

  % http://www.MATLABsky.com

  % http://www.mfun.la

  % http://video.ourmatlab.com

  % last modified by 2010.12.27

  %% a litte clean work

  tic;

  close all;

  clear;

  clc;

  format compact;

  %%

  % 首先载入数据

  load heart_scale;

  data = heart_scale_inst;

  label = heart_scale_label;

  % 选取前200个数据作为训练集合,后70个数据作为测试集合

  ind = 200;

  traindata = data(1:ind,:);

  trainlabel = label(1:ind,:);

  testdata = data(ind+1:end,:);

  testlabel = label(ind+1:end,:);

  % 利用训练集合建立分类模型

  model = svmtrain(trainlabel,traindata,'-s 0 -t 2 -c 1.2 -g 2.8');

  % 分类模型model解密

  model

  Parameters = model.Parameters

  Label = model.Label

  nr_class = model.nr_class

  totalSV = model.totalSV

  nSV = model.nSV

  % 利用建立的模型看其在训练集合上的分类效果

  [ptrain,acctrain] = svmpredict(trainlabel,traindata,model);

  % 预测测试集合标签

  [ptest,acctest] = svmpredict(testlabel,testdata,model);

  %%

  toc;

  复制代码
  运行结果:

  model =

  Parameters: [5x1 double]

  nr_class: 2

  totalSV: 197

  rho: 0.0583

  Label: [2x1 double]

  ProbA: []

  ProbB: []

  nSV: [2x1 double]

  sv_coef: [197x1 double]

  SVs: [197x13 double]

  Parameters =

  0

  2.0000

  3.0000

  2.8000

  0

  Label =

  1

  -1

  nr_class =

  2

  totalSV =

  197

  nSV =

  89

  108

  Accuracy = 99.5% (199/200) (classification)

  Accuracy = 68.5714% (48/70) (classification)

  Elapsed time is 0.040873 seconds.

  >>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...抛物线y=x2-4x+3与x轴交于A、B两点,与y轴交于点C,连AC,将直线AC向右... 抢劫罪的构成要素有哪些 抢劫罪的几个要素 抢劫罪违反了什么法律 转化型抢劫的法律认定 我想问问我的魔兽世界帐号值多少钱? 我的号能卖多少?(魔兽世界) 求评估魔兽世界账号价值,懂得来! 魔兽世界账号问题,我有一个90级的DK,想便宜出售了,直接卖了,想问问大... 魔兽世界号价值评估 wxid开头的怎么加好友 三星手机c7屏幕多少钱 华北电力大学北京校部机械工程研究生就业率 一个手机号怎么申请第二个? ...面积不是很大.4S店可以保修吗?不保的话修一下大概多钱? 有对方的怎么加不了? 加不了好友怎么回事?532 我的加别人为什么加不上好友515 第一次抽烟,为什么感觉和空气差不多 吡虫啉是内吸型农药吗?对棉花的盲蝽蟓有效吗? 信用卡小黑屋影响其他银行吗? 电流表与用电器在不同支路上,电压表在干路上,那么它们是并联还是串联... ...而你心里还是很爱欢她。如果她回来找你,我该怎么做? 如何将微信好友转移到另一个上? 我够不着阴道穹隆怎么办 QQ邮箱关联网易163邮箱,pop3之类的协议两个邮箱都开启...1 ...是电大的成人教育,财务工作16年,是否可以申请加拿大技术移民... 查重率低于10什么概念 一年内第二次修改技巧 用加不上好友为什么918 wxid这种怎么加 同一个手机号注册两个,新的刚注销,旧的怎么找回? 为什么SVM训练多分类结果很好,测试结果都分成同一类??急求 用《猎人》这首诗歌写一篇文章。 用《望洞庭》这首诗改写一篇写景的文章533 新上了个手机号码,可能以前被别人注册过,我现在想自己重新注册... 朗逸发动机盖怎么打开?朗逸发动机盖打开的方法 可以推荐一下动物园或过游乐园的模拟经营游戏吗,画面 一个关于动物园的游戏??12 李鸿章又喝酒又抽烟,为什么可以活到七十八岁高龄? 有木有人知道一款有动物园、过山车、水上乐园的模拟经营类游戏?... 谁知道有一段话 我不在的日子里 你要好好照顾自己 多抽烟 多...3 如果药没有放到阴道穹窿处或者放过了会有影响吗 一念永恒还会有107吗 求WIN7能用的Adobe Premiere Pro CS4... 怎么找回原来注册的 wxid开头的怎么添加好友? 神舟七号飞船进入太空后,出舱行走的是谁52 打了对方一巴掌,对方要求到医院做全身检查,不该检查的也检查了...12 用平板看了一些不该看的东西,删除了还会查到记录吗