Kernel 为支持向量机(XOR)设计内核

Kernel 为支持向量机(XOR)设计内核,kernel,machine-learning,svm,Kernel,Machine Learning,Svm,我的问题的核心是“如何为学习问题设计核函数?” 作为一个快速的背景,我正在阅读关于支持向量机和核机器的书籍,我看到的每一个地方,作者都给出了核的例子(齐次和非齐次多项式核,高斯核,以及一些基于文本的核),但所有这些都要么提供结果的图片,而不指定内核,要么含糊其辞地宣称“可以构建一个高效的内核”。我对为新问题设计内核的过程感兴趣 可能最简单的例子是学习XOR,一个嵌入真实平面的最小(4点)非线性数据集。如何设计一个自然的(非平凡的)内核来线性分离这些数据 作为一个更复杂的例子(参见Cristian

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

作为一个快速的背景,我正在阅读关于支持向量机和核机器的书籍,我看到的每一个地方,作者都给出了核的例子(齐次和非齐次多项式核,高斯核,以及一些基于文本的核),但所有这些都要么提供结果的图片,而不指定内核,要么含糊其辞地宣称“可以构建一个高效的内核”。我对为新问题设计内核的过程感兴趣

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

作为一个更复杂的例子(参见Cristianini,《支持向量机简介》,图6.2),如何设计内核来学习棋盘模式?克里斯蒂亚尼尼表示,这张图片是“使用高斯核”推导出来的,但他似乎使用了多重核,并且以一种未指明的方式对它们进行了组合和修改

如果这个问题太宽泛而无法在这里回答,我希望能参考一个这样的核函数的构造,尽管我更希望这个例子有点简单。

(对于不熟悉机器学习中使用核函数的人,核只是映射输入向量(组成数据集的数据点)然后,SVM在变换后的空间中找到一个具有最大裕度(超平面和支持向量之间的距离)的分离超平面。)

好的,从已知与SVM分类器一起工作以解决感兴趣的问题的核开始。在这种情况下,我们知道,径向基函数(RBF)核w/a训练的支持向量机能够清晰地分离异或。可以通过以下方式在Python中编写RBF函数:

def RBF():
    return NP.exp(-gamma * NP.abs(x - y)**2)
其中gamma是特征数(数据集中的列)的1/2,x,y是笛卡尔对

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

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

  • 线性核

  • 多项式

  • 乙状结肠

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

A:“非常小心”

尝试通常的猜测(线性、多项式、RBF)并使用最有效的方法,对于试图获得最准确的预测模型的人来说,这确实是一个明智的建议。值得一提的是,对支持向量机的一个常见批评是,它们似乎有很多参数需要根据经验进行调整。所以至少你不是一个人


如果你真的想为一个特定的问题设计一个内核,那么你是对的,它本身就是一个机器学习问题。这被称为“模型选择问题”。我自己在这里并不是一个专家,但对我来说,了解内核方法的最好来源是Rasumussen和Williams的书(在线免费提供),特别是第4章和第5章。很抱歉,我只能说“阅读这本数学巨著”,但这是一个复杂的问题,他们在解释它方面做得非常好。

我正在通过示例寻找一些多项式内核工作,无意中发现了这篇文章。如果您仍在寻找,以下几点可能会有所帮助(http://www2.fml.tuebingen.mpg.de/raetsch/projects/shogun)它使用多内核学习,您可以选择多种内核方法,然后学习将为问题选择最佳方法,因此您不必这样做

选择内核的一种更简单、更传统的方法是对不同的内核方法进行交叉验证,以找到最佳方法


希望这能帮助您或其他人阅读内核方法。

我的方法是研究数据:如何区分XOR问题中的点?当我开始学习M.L.的时候,特别是我做的SVM,我把玩具问题,用手画出来,试着把它们分开

当我第一次研究异或问题时,我突然想到两个紫色点(左下方)的X和Y符号相同,在一个例子中,一个是负数,一个是正数,而两个绿色点的X和Y符号相反。因此,对于绿色点,X和Y的平方和为0(或非常小,在初始问题中有一点噪声),对于紫色点,X和Y的平方和为2(或接近2)。因此,添加第三个坐标
Z=np.sqrt(np.square(X+Y))
将很好地分隔这两组:

一个旁注,Z并不是太不同的公式,如果你认为<>代码> np.qRT(NP方(x+y))本质上与<代码> NP.ABS(x+y)在这种情况下是相同的。 我没有获得Cristanini的论文,但我也会以类似的方式处理这个问题,从一个玩具版本开始(顺便说一句,多亏了其他人):

这里一个可能的直觉是,黑色方块的行和列索引之和总是偶数,而白色方块的行和列索引之和总是奇数,因此在这个简单的版本中,添加像
(row\u index+col\u index)%2这样的第三维度就可以了。在更大、更复杂的棋盘数据集中,如我在web上发现的:

事情并非如此简单,但也许可以将集群级联到fi