帮助我理解二进制 SVM 中的线性可分性

Posted

技术标签:

【中文标题】帮助我理解二进制 SVM 中的线性可分性【英文标题】:Help me understand linear separability in a binary SVM 【发布时间】:2011-04-29 04:30:23 【问题描述】:

我从math.stackexchange.com 交叉发布此消息,因为我没有收到任何反馈,而且这对我来说是一个时间敏感的问题。


我的问题与支持向量机中超平面的线性可分性有关。

根据Wikipedia:

...形式上,支持向量机 构造一个超平面或一组 高或无限的超平面 维度空间,可以使用 用于分类、回归或 其他任务。直觉上不错 分离是由 最大的超平面 到最近的训练数据的距离 任何类别的点(所谓的 功能余量),因为一般来说 边距越大越低 的泛化错误 分类器.分类器。

超平面对类的线性分离对我来说很直观。而且我想我理解二维几何的线性可分性。但是,我正在使用流行的 SVM 库 (libSVM) 实现 SVM,并且在处理数字时,我无法理解 SVM 如何在类之间创建曲线,或者将类别 1 中的中心点包含在圆形曲线中如果 n 维空间 V 中的超平面是维度 n - 1 的“平面”子集,或者对于二维空间 - 一维线,则被类别 2 中的点包围。

这就是我的意思:

那不是超平面。那是圆形的。这是如何运作的?还是 SVM 内部的维度比二维 2D 输入特征多?


此示例应用程序可以在here下载。


编辑:

感谢您的全面回答。所以 SVM 可以通过使用核函数很好地分离奇怪的数据。在将数据发送到 SVM 之前对数据进行线性化是否有帮助?例如,我的一个输入特征(一个数值)有一个转折点(例如 0),它恰好适合类别 1,但高于和低于零它适合类别 2。现在,因为我知道这一点,它会帮助分类发送这个特征的绝对值给SVM?

【问题讨论】:

线性化数据是一种选择,但核函数的好处之一是您实际上不需要构造这样的空间。内核有效地衡量了数据点的不相似性。实际上找到一个实现任意内积的空间可能涉及引入无限维数。但是所有 SVM 算法需要的是一个内积。事实上,IIRC,它真正需要的只是足够“像”内积的东西。 这个问题是这里的主题:stats.stackexchange.com @Shane:是的,但是 SO 的更多受众得到更快的答案。 【参考方案1】:

这是通过应用所谓的 [内核技巧] (http://en.wikipedia.org/wiki/Kernel_trick) 来完成的 基本上所做的是,如果某些东西在现有输入空间中不是线性可分的(在您的情况下为 2-D),则将其投影到更高的维度,这将是可分离的。应用内核函数(可以是非线性的)来修改您的特征空间。然后所有计算都在这个特征空间中执行(也可能是无限维度的)。

输入中的每个点都使用此核函数进行转换,并且所有进一步的计算都将执行,就好像这是您的原始输入空间一样。因此,您的点可能在更高维度(可能无限)中是可分离的,因此更高维度中的线性超平面在原始维度中可能不是线性的。

举个简单的例子,考虑 XOR 的例子。如果您在 X 轴上绘制 Input1,在 Y 轴上绘制 Input2,那么输出类将是:

    0 类:(0,0), (1,1) 1 类:(0,1), (1,0)

如您所见,它在二维中不是线性可分的。但是如果我在 3-D 中采用这些有序对,(只需在 3-D 中移动 1 个点)说:

    0 类:(0,0,1), (1,1,0) 第 1 类:(0,1,0), (1,0,0)

现在您可以很容易地观察到,在 3-D 中存在一个平面,可以将这两个类线性地分开。

因此,如果您将输入投影到一个足够大的维度(可能是无限大的),那么您将能够在该维度上线性地分离您的类。

这里需要注意的重要一点(也许我也会回答您的另一个问题)是您不必自己制作内核函数(就像我在上面制作的那样)。好消息是内核函数会自动处理您的输入并找出如何“线性化”它。

【讨论】:

【参考方案2】:

正如 mokus 所解释的,支持向量机使用 内核函数 将数据隐式映射到线性可分的特征空间:

不同的核函数用于各种数据。请注意,图片中的转换会添加一个额外的维度(特征),尽管此特征从未在内存中具体化。

(来自Chris Thornton, U. Sussex的插图。)

【讨论】:

SVM 如何知道哪个核函数会明智地分离数据?它会遍历一堆方程并计算出哪个产生最大的边距吗?另请参阅对我的问题的修改。 内核通常由用户/开发者设置为参数。例如,LibSVM 具有线性、多项式、RBF 和 sigmoid 内核类型。它的作者向初学者推荐 RBF 内核。【参考方案3】:

对于二维空间中给出的问题中的 SVM 示例,设 x1、x2 为两个轴。您可以有一个转换函数 F = x1^2 + x2^2 并将这个问题转换为一维空间问题。如果您仔细观察,您可以看到在转换后的空间中,您可以轻松地线性分离点(F 轴上的阈值)。这里变换的空间是[F](一维)。在大多数情况下,您将增加维度以获得线性可分的超平面。

【讨论】:

这也是我的解释,因为线性度与内核的输出有关,而不是内核本身的形状。如果有四个维度 F=x1^2 + x2^2 + x3^3 + x4^2,在阈值 F 上它仍然是一维的。【参考方案4】:

查看此YouTube video,该示例说明了线性不可分点在映射到更高维度时可被平面分开的示例。

【讨论】:

很棒的视频,我希望我能找到更多这样的东西!【参考方案5】:

My answer to a previous question 可能会对这种情况下发生的事情有所了解。我给出的例子是非常人为的,并不是真正发生在 SVM 中的事情,但它应该会给你带来直觉。

【讨论】:

【参考方案6】:

SVM clustering

HTH

【讨论】:

【参考方案7】:

我对 SVM 并不十分熟悉,但从我的研究中回忆,它们经常与“内核函数”一起使用——本质上,它是标准内积的替代品,可以有效地使空间非线性化。它大致相当于将非线性变换从您的空间应用到应用线性分类器的某个“工作空间”,然后将结果拉回您的原始空间,分类器使用的线性子空间不再是线性的。

***文章在“非线性分类”小节中确实提到了这一点,并附有指向 http://en.wikipedia.org/wiki/Kernel_trick 的链接,该链接更广泛地解释了该技术。

【讨论】:

我记得,Numerical Recipes 有一个非常好的部分,介绍了使用核函数实现 SVM 以解决非线性分类问题。 实际上,即使您手动进行特征空间扩展,也永远不需要“拉回结果”步骤。您只需在扩展的特征空间中进行点积,为每个 SV/测试样本对提供一个数字。

以上是关于帮助我理解二进制 SVM 中的线性可分性的主要内容,如果未能解决你的问题,请参考以下文章

Support Vector Machine:求解线性可分SVM的最佳边界

SVM

实现线性二进制 SVM(支持向量机)

在 SVM 中练习内核技巧

07 SVM - 软间隔模型

spark.mllib源码阅读-分类算法3-SVM