Libsvm中的决策值

时间:2012-06-14 09:28:20

标签: matlab svm libsvm prediction

我是SVM的新手。我使用Libsvm for Matlab,在预测阶段后我得到了一个决策值数组。根据SVM理论:如果

,每个测试记录z都被指定为正数
  

F(z)的= 1

其中f(z)定义为

  

F(Z)=符号(W * Z + B)

那么如何将实例z的数组的决策值与f(z)相关联? 预测是基于决策值所以:如果dec_value> 0则z为正,否则z为负?

2 个答案:

答案 0 :(得分:14)

是的,你是对的,如果f(z)是正数,那么实例属于+1级,如果它的负数属于-1级。 f(z)的值不可解释。

虽然功能:

f(z)=符号(w * z + b)

看起来像超平面的方程,它的不同之处在于w不是法向量 - 它的长度不是1,所以f(z)的值不是超平面的距离,这就是它被指定的原因作为符号(..),为了清楚说明该值仅用于确定实例所在的超平面的哪一侧。

某些背景:

目标是找到超平面,它给出了两个类之间的最大余量:

enter image description here

因此,目的是最大化边距,即enter image description here,从而最小化enter image description here。请记住,通常当 w 用于表示超平面作为法向量时,为1.这里的情况并非如此,因为没有优化问题。我们没有保持 = 1并改变边距的宽度,而是将边距的宽度固定为2,并允许改变大小。

这为我们提供了primal optimization problem(带有软边距):

enter image description here

这似乎就是你所指的。然而,这个等式来自基本的软最大边际分类器,它是SVM的基础。 True SVM被公式化为Lagrangian dual以允许使用内核。关于SVM的巧妙之处在于,当拉格朗日语中出现上述问题(及其约束)时,除了拉格朗日乘数之外的所有变量都会丢失,这给我们留下了以下问题:

enter image description here

请注意,没有 w 。训练点 x y 是标签,1或-1),现在只作为点积一起出现,允许我们使用kernel trick来获得非线性模型。

但如果我们没有 w 我们的决策功能是什么?它成为我们的支持向量和我们发现的拉格朗日乘数的函数。

enter image description here

这就是libsvm生成的内容以及它作为您训练过的模型存储的内容。它存储支持向量和相关的alpha。对于线性SVM,您可以获得原始 w this is explained here in the LibSVM FAQ,但它不会是您从LibSVM自动获取的内容,而这只能用于线性内核。

基于拉格朗日乘数和支持向量的SVM决策函数的值也只能用它的符号来解释。

答案 1 :(得分:2)

阅读文档告诉我:

  

第三个[返回值]是包含决策值或概率的矩阵   估计(如果指定'-b 1')。如果k是中的类数   训练数据,对于决策值,每行包括结果   预测k(k-1)/ 2二进制类SVM。

因此,对于两类问题,你得到的是一个包含决策值f(z)的向量,所以这意味着属于第一类的所有东西都为d <0,属于第二类的所有东西都有d&gt; 0

一般来说:libsvm认为它的第一个类是它获得的第一个标签,依此类推。因此,为了获得可靠的结果,您需要先对数据进行排序。

在二进制的情况下,这也适用:无论你给svmtrain提供什么标签,它都会遇到第一个遇到的类1,第二个作为类-1。通过提供一个简单的数据集,可以轻松验证这一点:

Y = [-ones(100,1);ones(100,1)];
m = svmtrain(Y,Y); % train with all labels as data (never do this in practices, not the "all" part, not the training on labels part ;)
[a,b,c] = svmpredict(Y,Y,m); % of course this will give 100% accuracy.
b' % you can see that the first label will always have an internal representation of 1.

对于多类别分类,这是不同的:它包含k(k-1)/ 2个条目,对应于每个像素的所有一对一类方案。 这意味着例如。一个4类问题,每个样本你有4 * 3/2 = 6个值:

[ f12(z) f13(z) f14(z) f23(z) f24(z) f34(z)]

现在这些函数值如何通过一对一映射到类中我无法通过查看代码轻松推断出来......但我猜你最不感兴趣的是那两类案例,不是吗?