svm对未知数据的分类_LibSVM学习3:一个实例搞定libsvm分类

本文详细介绍了如何使用 LibSVM 库进行分类预测,通过实例解释了属性矩阵和标签的概念,并展示了如何通过训练建立分类模型并进行预测。内容包括 SVM 参数设置、数据准备、模型训练和测试,以及如何解读模型参数,帮助读者掌握 SVM 分类的基本流程。
摘要由CSDN通过智能技术生成

转自:【by faruto】

视频的帖子地址:

本讲视频相关帖子:【1】如何使用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中,即

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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值