【问题标题】:Designing a Kernel for a support vector machine (XOR)为支持向量机 (XOR) 设计内核
【发布时间】:2011-08-25 07:57:38
【问题描述】:

我的问题的核心是“如何为学习问题设计核函数?”

作为快速背景知识,我正在阅读有关支持向量机和内核机器的书籍,并且在我所见的任何地方,作者都给出了内核的示例(多项式内核,同质和非同质,高斯内核,以及对基于文本的内核的暗示)一些),但都提供了结果图片而不指定内核,或者模糊地声称“可以构造一个有效的内核”。当一个人为一个新问题设计一个内核时,我对这个过程很感兴趣。

可能最简单的例子是学习 XOR,这是一个嵌入真实平面的最小(4 点)非线性数据集。如何想出一个自然的(和非平凡的)内核来线性分离这些数据?

作为一个更复杂的示例(参见 Cristianini,SVM 简介,图 6.2),如何设计内核来学习棋盘模式? Cristianini 表示该图片是“使用高斯核”推导出来的,但他似乎使用了多个,并且它们以未指定的方式组合和修改。

如果这个问题太宽泛而无法在这里回答,我希望能参考构造一个这样的内核函数,但我希望这个例子稍微简单一些。

【问题讨论】:

  • 你用 svm 实现了异或逻辑门吗?

标签: kernel machine-learning svm


【解决方案1】:

(对于不熟悉在机器学习中使用核函数的任何人,核只是将输入向量(构成数据集的数据点)映射到更高维空间,也就是“特征空间”。SVM然后在这个变换空间中找到一个具有最大边距(超平面和支持向量之间的距离)的分离超平面。)

好吧,从已知可与 SVM 分类器一起工作的内核开始,以解决感兴趣的问题。在这种情况下,我们知道带有经过训练的 SVM 的 RBF(径向基函数)内核可以清晰地分离 XOR。你可以用这种方式在 Python 中编写 RBF 函数:

def RBF():
    return NP.exp(-gamma * NP.abs(x - y)**2)

其中gamma是1/特征数(数据集中的列),x,y是笛卡尔对。

(径向基函数模块也在scipy.interpolate.Rbf中)

其次,如果您所追求的不仅仅是使用可用的核函数来解决分类/回归问题,而是您想构建自己的,我建议首先研究核函数的选择以及这些函数中的参数影响分类器性能。与 SVM/SVC 共同使用的一小部分内核函数是最好的起点。该组由(RBF 除外)组成:

  • 线性内核

  • 多项式

  • 乙状结肠

【讨论】:

  • 我们如何提前确定内核是否“干净地分离”了任何东西?当然,它比民间传说和猜测和检查更有原则。你是说我们用线性/多项式/sogmoid 核的某些组合来近似最好的核?因为这听起来本身就是一个机器学习问题,即使我们将自己限制为一类内核。
  • 没有。在这里, 不依赖内核来分离数据,而是将数据投影到更高维的特征空间中。其次,我提到了一个简单的实证研究,而不是“民间传说”。例如,一个简单的研究:相同的数据,相同的 SVM 参数,内核选择是唯一可调参数;来衡量最简单的核对 SVM 分类器性能的影响)。
  • 您说,“从已知有效的内核开始”,这对我来说听起来像是民间传说。并且内核的要点是通过该投影分离数据,否则将没有分离超平面。我的问题是是否有任何理论理由为给定问题选择线性/多边形/sigmoid/rbf 内核,以及如何将它们组合起来以适应问题的任何已知(空间)属性。您的回答是“实证研究”,这实际上只是一种猜测和检查的奇特方式。
  • 考虑到您的问题在某些方面相当笼统,我认为道格的回答没有任何问题。正如他在评论中所建议的那样,将已知可解决某些类型问题的所有内核作为参数传递给网格搜索将是一种非常好的方法,也许使用嵌套交叉验证和相同算法 (SVC) 仅更改内核。
【解决方案2】:

问:“如何为学习问题设计核函数?”

A:“非常小心”

尝试常见的猜测(线性、多项式、RBF)并使用最有效的方法对于试图获得最准确预测模型的人来说确实是合理的建议。值得一提的是,对 SVM 的普遍批评是,它们似乎有很多参数需要您根据经验进行调整。所以至少你并不孤单。

如果您真的想为特定问题设计内核,那么您是对的,这本身就是一个机器学习问题。这被称为“模型选择问题”。我自己在这里并不完全是专家,但对我来说深入了解内核方法的最佳来源是 Rasumussen 和 Williams 的书“Gaussian Processes”(可在线免费获得),尤其是第 4 章和第 5 章。对不起我只能说“阅读这本充满数学的巨书”,但这是一个复杂的问题,他们在解释方面做得非常好。

【讨论】:

  • 你很幸运我不怕数学 :) 更棒的是这本书的竞赛是在线的。
  • @Bean 我认为这种类型的进一步问题最好直接指向metaoptimize.com/qa。这是一个较小的社区,但那里有更多的机器学习专家。
【解决方案3】:

我正在通过示例寻找一些多项式内核工作,并偶然发现了这篇文章。如果您仍在寻找一些可能会有所帮助的东西是这个工具包(http://www2.fml.tuebingen.mpg.de/raetsch/projects/shogun),它使用多内核学习,您可以在其中选择多种内核方法,然后学习会选择最适合问题的方法,因此您不必这样做。

您选择内核的一种更简单、更传统的方法是使用不同内核方法的交叉验证来找到最佳方法。

希望这可以帮助您或其他任何人阅读内核方法。

【讨论】:

  • 不幸的是,我一直在寻找数学上的理由,而不是经验上的理由。我还没有找到一个,所以我把它交给了应用数学和任意参数的祸根。
【解决方案4】:

我的方法是研究数据:如何分离 XOR 问题中的点?当我开始学习 M.L.总的来说,特别是 SVM,我就是这样做的,解决了玩具问题,手工绘制,并尝试分离类。

当我第一次查看 XOR 问题时,我突然想到两个紫色点(左下方)的 X 和 Y 具有相同的符号,在一种情况下为负一个正,而两个绿点都有 X和相反符号的 Y。因此,对于绿色点,X 和 Y 的平方和将为 0(或非常小,在初始问题中有一点噪声),而对于紫色点,则为 2(或接近 2)。因此,添加第三个坐标Z = np.sqrt(np.square(X + Y)) 将很好地分开这两个集合:

附带说明,Zdoug's rbf 的表述并没有太大不同,如果您认为在这种情况下 np.sqrt(np.square(X + Y))np.abs(X + Y) 基本相同。

我无法访问 Crisitanini 的论文,但我也会以类似的方式解决这个问题,从玩具版本开始(顺便说一下,checkerboard code 感谢doug):

这里可能的直觉是黑色方块的行和列索引的总和总是偶数,而白色方块总是奇数,所以添加像(row_index + col_index) % 2 这样的第三维就可以了在这个简单的版本中。在一个更大、更复杂的棋盘数据集中,就像我在网上找到的这样:

事情没那么简单,但也许可以级联聚类以找到 16 个集群的平均 X 和 Y 位置(可能使用medoids clustering),然后应用“模内核技巧”的一个版本?

由于我没有处理大量分类问题的免责声明,到目前为止,我发现在制作复杂问题的玩具版本时,我通常对解决方案有一种“数字”直觉这可能会奏效。

最后,正如在对 doug 答案的评论中发布的那样,我没有发现 empirical approach like his 有任何问题,通过使用相同算法 (SVC) 在嵌套交叉验证中将所有可能的内核传递给网格搜索来研究所有可能内核的性能并且只改变内核。您可以通过在转换后的特征空间中绘制相应的边距来添加该方法:例如,对于 rbf,使用 Doug 建议的方程(以及 Sebastian Raschka 绘制决策区域的例程 - cell 13 here)。

2017 年 10 月 27 日更新 在我的 slack 频道的一次谈话中,另一位地球物理学家问我关于异或门设计为 0 和 1 而不是 -1 和 1 的情况(后者类似于勘探地球物理学中的一个经典问题,因此我最初的玩具示例)。

如果我要使用 0 和 1 处理 XOR 门,并且没有关于 rbf 内核的知识,那么在这种情况下,我也会根据这些问题的坐标来研究这个问题看看我能不能想出一个转变。

我在这里的第一个观察是Os 位于x=y 线上,Xs 位于x=-y 线上,因此x-y 的差异将是0(或小而有一点噪音),另一个分别为 +/-1。绝对值会处理符号,因此 Z = np.abs(X-Y) 会起作用。顺便说一句,这与doug'srbf = np.exp(-gamma * np.abs(x - y)**2) 非常相似(另一个支持他的答案的原因);事实上,他的 rbf 是一个更通用的解决方案,适用于所有 XOR 情况。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2014-09-24
    • 2012-10-12
    • 2020-10-01
    • 2018-07-09
    • 2019-05-16
    • 2019-01-23
    • 2014-05-12
    • 2015-05-31
    相关资源
    最近更新 更多