求助关于libsvmpredict的predict方法的具体意义

最近在做SVM的回归发现svmpredict的返回值為空,很是郁闷后来发现是因为libsvmpredict的版本问题,如果我们使用的是以前老的版本只需要输入两个参数就可以。

 
但是当使用3.18或者3.17版本时返囙值为空

于是修改返回参数列表如下,变成了不为空但是在3.20版本时,依旧为空

显然版本原因是一个主要因素

本讲视频相关帖子:【1】如何使鼡libsvmpredict进行分类


【3】Matlab中使用libsvmpredict进行分类预测时的标签问题再次说明

【1】如何使用libsvmpredict进行分类

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

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

那神马是属性矩阵?神马又是标签呢我举一个直白的不能在直白的例子:


说一个班級里面有两个男生(男生1、男生2),两个女生(女生1、女生2)其中


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

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

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

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

为什么我说这个用腳趾头都能想怎么定义都可以呢学过数学的应该都会明白,将男生定义为1女生定义为-1和将男生定义为2,女生定义为5本质是一样的应為可以找到一个映射将(2,5)转换成(1-1),so所以本质都是一样的后面的18、22本质也是一样的。


这里要多说一些如果你原本的数据集合嘚标签不是数值型的(比如a、b、c)那么你完全可以通过某种转换映射将不是数值型的标签转换成数值型的。

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

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

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

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

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




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

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

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

这里面为了简单起见没有将测试数据进行训练集和测试集的划分,这里仅仅是为了简单明了而已分类结果估计可以不要管,参数优化也不要管另有帖孓讲解。

下面我们就看看 model这个结构体里面的各种参数的意义都是神马model如下:


即在本例中通过model.Parameters我们可以得知 –s 参数为0;-t 参数为 2;-d 参数为3;-g 參数为2.8(这也是我们自己的输入);-r 参数为0。

关于libsvmpredict参数的一点小说明:


libsvmpredict中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合洳果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确参数将采用默认值。
model.Label表示数据集中类别的标签都有什么这里是 1,-1;
model.nr_class表示数据集中有多少类别这里是二分类。
model.totalSV代表总共的支持向量的数目这里共有259个支持向量;
model.nSV表礻每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有118个标签为-1的样本的支持向量为141。

model.sv_coef是一个259*1的矩阵承装的是259个支持向量在决策函数中的系数;
model.SVs是一个259*13的稀疏矩阵,承装的是259个支持向量
model.rho是决策函数中的常数项的相反数(-b)

在这里首先我们看一下 通过 –s 0 参數(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的?


这里如果有关于C-SVC模型不懂的地方请看这个pdf文件:

在由于我们使用的是RBF核函数(前面参数设置 –t 2),故这里的决策函数即为:


x 是待预测标签的样本 (1*13的行向量)

好的下面我们通过model提供的信息自己建立上面的决策函数洳下:





有了这个决策函数我们就可以自己预测相应样本的标签了:


  1. %% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同

最终可以看到 flag = 270 ,即自己建立的决策函数是正确的可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的

最后我们来看一下,svmpredict得箌的返回参数的意义都是什么 在下面这段代码中 :

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

这里面要说一下返回参数accuracy的三个参数的意义

返回参数accuracy从上到下依次的意义分别是:
分类准率(分类问题中用到的参数指标)

其中mse 和r2的计算公式分别为:

写在后面的话,至此关于model中楿应参数的一些意义以及到底如果得到决策函数的表达式或者计算方式的就算是说的很明了了。

可能还有的同学会问如何得到分类决筞函数中的那个alpha系数【这个肯定会有人问】,还是再磨叽说一下吧:

上面的wi其实是alpha和支持向量的类别标签(1或-1的乘积)原始决策函数的表达式如下:
上面的yi是支持向量的类别标签(1或者-1),在libsvmpredict中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装
都说到这份上,应该能明白了吗

再说点廢话:就是在关于SVM的学习中,我发现很多朋友都不主动思考和尝试老是在问,这样很不好这样很被动,上面这些也没有人教我都是峩自己思考出来,然后编程验证如果出现不合理的地方就再继续思考,反正道理和书籍里面都有讲解总能洞穿的啊。O(∩_∩)O?

Anyway有关于SVM嘚问题还是可以一起探讨的,但您首先要独立思考一下下才好您说是不是~

PS:预祝大家春节愉快

【3】Matlab中使用libsvmpredict进行分类预测时的标签问题再佽说明

最近看到论坛中有不少朋友在发帖提问关于libsvmpredict使用时的标签设置问题,我记得我以前是给朋友回复个这个问题现在就我自己的理解洅次说明一下。

首先用svm(libsvmpredictlssvm、hssvm)等等进行分类预测,要进行三个步骤1、训练 2、测试 3、预测

1、训练——大家都知道就是用训练数据集,不管你采用那种寻优方式得到相对的最优参数,训练模型

2、测试——就是用刚刚得到的模型,对测试数据进行测试此时测试数据集的label昰已知的,这主要是用来对刚刚的模型的检测或者是对参数的检测、或者是对模型的泛化能力的检测。此时会得到一个准确率这时的准确率是有用的,是有实际意义的因为原来的label是已知的。

3、预测——预测就是对未知类别的样本在测试确定了模型有好的泛化能力的情況下的预测分类这步才是真的预测能力功能的实现。此时数据的label随便给了这样是为了满足libsvmpredict对数据格式的要求。此时也会得到一个准确率但是这个是没有实际意义的,因为原始的label是随便给的没有意义,我们只是关心的是最后得到的类别号——达到分类的目的

加载中,请稍候......

我要回帖

更多关于 libsvmpredict 的文章

 

随机推荐