快捷搜索:  汽车  科技

支持向量机作者简介(支持向量机第六章)

支持向量机作者简介(支持向量机第六章)代码表31显示用Python来实现这种变换。定义为:图38:一条直线不能分类这些数据虽然你的原数据是二维的,但没有任何事情阻止你在给SVM喂数据之前做一些变换。一个可行的变换是,比如,将每一个二维向量(x1 x2)变成三维向量。例如,我们可以使用一种叫多项式映射的方法

第六章 核方法

吴天晖/译

特征变换

我们能分类非线性可分的数据吗?

设想你有一些数据是不可分的(如图38所示),但是你还是想用SVMs去分类。我们认为这是不可能的,因为这些数据是非线性可分的。然而,后一种是是不正确的。我们在这里要重点注意那些在二维平面中非线性可分的数据。

支持向量机作者简介(支持向量机第六章)(1)

图38:一条直线不能分类这些数据

虽然你的原数据是二维的,但没有任何事情阻止你在给SVM喂数据之前做一些变换。一个可行的变换是,比如,将每一个二维向量(x1 x2)变成三维向量。

例如,我们可以使用一种叫多项式映射的方法

支持向量机作者简介(支持向量机第六章)(2)

定义为:

支持向量机作者简介(支持向量机第六章)(3)

代码表31显示用Python来实现这种变换。

代码表31 # Transform a two-dimensional vector x into a three-dimensional vector. def transform(x): return [x[0]**2 np.sqrt(2)*x[0]*x[1] x[1]**2]

如果你将图38中的所有数据都作了变换并且用图表示出来,你可得到图39 看起来显示得不是很完善,事实上,在三维空间里他们是可分的(图40和图41)!

支持向量机作者简介(支持向量机第六章)(4)

图39:这些数据在三维空间里看起来是不可分的

支持向量机作者简介(支持向量机第六章)(5)

图40: 实际上可以用一个平面来分类这些数据

支持向量机作者简介(支持向量机第六章)(6)

图41: 从另一个角度看这个平面和数据

这里有一个基本的方法我们可以用来分类数据集:

1. 使用代码表 31的变换方法将每一个二维向量变换成一个三维向量。

2. 用这些三维数据训练SVMset。

3. 对于每一我们要预测的新示例,我们在把它们放入假设方法之前需要先用变换方法作变换。

当然,不是强制你将这些数据变换成三维的;它可能是5、10、或者100维。

我们如何知道哪一种变换是合适的呢?

选择哪一种变换是否合适绝大部份依赖于你的数据集。能够变换数据使你希望表现得最好机器学习算法可能在机器学习世界里的已经有成功的办法。不幸的是,这里没有完美的解决方法,它是来自试验和错误的经历。在用任何算法之前,请确定已经创细检查了它们文档中的变换数据的一般规则。更多关于如何去处理你的数据,你可以阅读在scikit-lean.org网站上的数据变换方案。

什么是核?

在上一节,我们看到一个快速的方法来处理不可分数据集。它的一个主要缺陷是我们必须变换每一个示例。如果我们成百万或成亿的示例会使变换方法变得复杂,它们会花巨量的时间。这就使我们需要核方法来解决。

你可以回忆,当我们在搜索乌尔夫对偶拉格朗日函数的KKT乘子时,我们不需要得到示例向量X的值;我们只需要知道两个训练示例xi·xj 的点积的值:

支持向量机作者简介(支持向量机第六章)(7)

在代码表32中,我们应用我们方法的第一步。设想我当数据用来学习时,我们仅仅关心的是点积,下面的例子返回8 100。

代码表32 x1 = [3 6] x2 = [10 10] x1_3d = transform(x1) x2_3d = transform(x2) print(np.dot(x1_3d x2_3d)) # 8100

这里的问题是:是否有方法可以不用变换向量而求出这个值?

答案是:是的,用核!

让我们仔细观察代码表33的函数:

代码表33 def polynomial_kernel(a b): return a[0]**2 * b[0]**2 2*a[0]*b[0]*a[1]*b[1] a[1]**2 * b[1]**2

用相同的两个示例数据用这个函数可以返回相同的结果(图34)。

代码表34 x1 = [3 6] x2 = [10 10] # We do not transform the data. print(polynomial_kernel(x1 x2)) # 8100

当你想想这个方法时一定觉得漂亮的不可思议。

向量x1和x2属于R2。核方法计算它们的点积就像它们已经变换成属于R3的向量一样。但是它没有做变换,而且没有去计算它们的点积!

从上可得:一个核方法可以有效的返回另一空间的点积。更正式,我们可以写为:

定义:给出一个映射

支持向量机作者简介(支持向量机第六章)(8)

,我们调用定义为

支持向量机作者简介(支持向量机第六章)(9)

的方法

支持向量机作者简介(支持向量机第六章)(10)

,在这里<· ·>v 表示V的内积,这就是一个核。

核功能

现在我们知道了一个核,我们将看到什么叫核功能。

当我们定义一个核如:

支持向量机作者简介(支持向量机第六章)(11)

,我们可以重写软边界对偶问题:

支持向量机作者简介(支持向量机第六章)(12)

这就是它,我们对对偶问题做了一个改动——我们称之为核功能。

技巧:应用核功能的简单意思就是用一个核方法来替换两个示例数据的点积。

这个改变看起来非常简单,但是要记住这个庄严的工作源自于原优化问题的乌尔夫对偶公式。我们现在有了这个强大的修改后核方法可以分类不可分数据了。

当然,我们还需要改变假设函数来使用核方法:

支持向量机作者简介(支持向量机第六章)(13)

记住在这个公式中S是支持向量集。看这个公式,我们更好的理解为什么SVMs也被称为稀疏核机。这是因为它们仅仅只需用核方法计算支持向量而不用计算所有的向量,如同其他核方法(Bishop 2006 )。

核类型

线性核

这是最简单的核。它简单的定义为:

支持向量机作者简介(支持向量机第六章)(14)

这里x和x'是两个向量。

实际应用时,你们可以参考一个更好的文本分类线性核(www.svm-tutorial.com/2014/10/svm-linear-kernel-good-text-classification/)。

多项式核

我们之前介绍核方法时已经见过了多项式核,在这里我们将介绍一个更通用的版本核:

支持向量机作者简介(支持向量机第六章)(15)

它有两个参数:c,表示常量项,d表示核的深度。这个核能很容易的用Pathon实现,如代码表35所示。

代码表35 def polynomial_kernel(a b degree constant=0): result = sum([a[i] * b[i] for i in range(len(a))]) constant return pow(result degree)

在代码表36中,我们看它当用深度2时它返回与代码表33的核一样的结果。用这个核训练的SVM的结果如图42所示。

代码表36 x1 = [3 6] x2 = [10 10] # We do not transform the data. print(polynomial_kernel(x1 x2 degree=2)) # 8100

支持向量机作者简介(支持向量机第六章)(16)

图42: 用多项式核的SVM可以分类这些数据(深度=2)

改变深度

多项式核如果深度为1且没有常数项就是一个简单的线性核(图43)。当你增加这个多项式核的深度时,决策边缘将变得更复杂而且会受到个别特殊的示例数据影响,如图44所示。用高深度的多项式是危险的,因为你能在测试数据集中得到很好的表现,但是会导致我们称之为的过拟合:模型太接近数据而不能更好的范化。

支持向量机作者简介(支持向量机第六章)(17)

图43: 深度为1的多项式核

支持向量机作者简介(支持向量机第六章)(18)

图43: 深度为6的多项式核

注意:用高深度的多项式核将经常导致过拟合。

RBF 或者高斯核

有时多项式核也不能在更复杂的情况下工作。当你有一个像图45所示的那种难以分类的数据集时,这种核就体现出局限来了。

支持向量机作者简介(支持向量机第六章)(19)

图45: 更难分类的数据集

我们看图46 分类这些数据的决策边缘非常糟糕。

支持向量机作者简介(支持向量机第六章)(20)

图46: 多项式核不能分类数据(深度为3 C=100)

这种情况是让我们去用其他的,更复杂的核:高斯核。它也命名为RBF核,这里RBF的名字来自于径向基函数(Radial Basis Function)。径向基函数是一个取值只依赖于原点或一些点的方向的函数。

RBF核函数是:

支持向量机作者简介(支持向量机第六章)(21)

你将经常看到它投射到无限维空间。这是什么意思?

重新回到定义:一个核就是一个函数返回另一个空间的点积。

之前我们所见到的多项式核,核会返回一个R3的点积。同理,RBF核返回R∞的点积。

在这里我不作证明,如果你想了解,可以阅读证明(http://pages.cs.wisc.edu/~matthewb/pages/notes/pdf/svms/RBFKernel.pdf)而更好的理解它。

支持向量机作者简介(支持向量机第六章)(22)

图47: RBF核能正确分类数据(gamma=0.1)

改变gamma值

支持向量机作者简介(支持向量机第六章)(23)

图48:高斯核(gamma=1e-5)

支持向量机作者简介(支持向量机第六章)(24)

图49:高斯核(gamma=2)

当gamma太小,如图48 这个模型的表现就像一个线性SVM。当gamma太小时,这个模型会被每一个支持向量强烈影响,如图49。更多关于gamma的信息,你可以阅读文档(http://scikit-learn.org/stable/auto_examples/svm/plot_rbf_parameters.html);

其他类型

核方法的研究相当广泛,现在有大量适用的核方法。一些专门的站点,像字符串核(string kernel https://en.wikipedia.org/wiki/String_kernel),可以基于文本使用。如果你想了解更多的核方法,凯撒·索萨的文章(crsouza.com/2010/03/17/kernel-functions-for-machine-learning-applications/)介绍了25种核方法。

我们要用哪个核呢?

首先推荐使用RBF核,因为通常工作得很好。然而,如果有足够的时间最好是试用一下其他的核方法。核就是两个向量相似度的量度,会对您手头上的问题知识领域有量大的影响。自己建立一个核也是可以的,但是需要你在核方法理论上有很好的数学基础。你可以在(Cristianini & Shawe-Taylor 2000) 找到更多的信息与建议。

小结

核功能是使用支持向量机更强大的一个关键组件。它可认我们的SVMs适用更多的问题。在这章里,我们看到线性核的局限,和多项式核如何分类不可分数据。最后,我们看到一些更好用且更强大的核方法,尝试去寻找为解决你的问题而建立的核方法。应用正确的核来处理正确的数据是你SVMs成败的一个主要因素。

猜您喜欢: