1

我是 SVM 的新手。我将 Libsvm 用于 Matlab,在预测阶段之后,我得到了一个决策值数组。从 SVM 理论:如果每个测试记录 z 被分配为正

f(z)=1

其中 f(z) 定义为

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

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

4

2 回答 2

15

是的,你是对的,如果 f(z) 为正,则实例属于 +1 类,如果为负,则属于 -1 类。f(z) 的值是不可解释的。

而功能:

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

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

一些背景:

目标是找到在两个类之间给出最大边距的超平面:

在此处输入图像描述

因此,目的是最大化边际,在此处输入图像描述因此最小化在此处输入图像描述。请记住,通常当w用于将超平面表示为法线向量时,为 1。这里的情况显然不是这样,因为不会有优化问题。我们没有保持= 1 并改变边距的宽度,而是将边距的宽度固定为 2,并允许改变大小。

这给了我们原始优化问题(具有软边距):

在此处输入图像描述

这似乎是你所指的。然而,这个方程来自基本的软最大边距分类器,它是 SVM 的基础。真正的 SVM 被表述为拉格朗日对偶,以允许使用内核。SVM 的巧妙之处在于,当上述问题(及其约束)用拉格朗日公式表示时,除拉格朗日乘数外的所有变量都退出了,给我们留下了以下问题:

在此处输入图像描述

注意没有w。训练点xy是标签,1 或 -1)现在仅作为点积一起出现,允许我们使用核技巧来获得非线性模型。

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

在此处输入图像描述

这就是 libsvm 生成的内容以及它作为您训练的模型存储的内容。它存储支持向量和相关的 alpha。对于线性支持向量机,您可以获得原始w这在 LibSVM 常见问题解答中进行了解释,但它不会是您从 LibSVM 自动返回的,这只能用于线性内核。

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

于 2012-06-14T21:18:36.360 回答
2

阅读文档告诉我:

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

所以对于一个二类问题,你得到的是一个包含决策值的向量f(z),所以这意味着属于第一类的所有东西都有 d<0,而属于第二类的所有东西都有 d>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)]

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

于 2012-06-14T12:50:42.593 回答