非线性支持向量机是最能够实用的支持向量机模型。核函数的使用是此模型的一大亮点。但是我在学习的过程中,发现很多网上的教程对有些概念没有强调说明,致使初学者包括当时的我容易混淆概念或者是不理解公式所云。我想一步步给大家展示一下核函数的详细内容。
本节算是支持向量机理论中比较高阶的了。有刚接触的朋友顺便可以看看《初阶的支持向量机》,或者《进阶的支持向量机》。有详细的理论推导。支持向量机是少数的有完备数学证明的机器学习模型之一。
升维处理问题
这个问题我相信大家都很清楚。在我们的数据集不能使用线性分类器完美分类的情况下,我们视不同情况有两种解决办法:第一种是在误分类点在分类超平面附近且数量较少时,我们使用带有软间隔的支持向量机,第二种是数据集误分类点很多,以致于线性分类器无法取得很好的效果的情况下,我们使用提升维度的方法来将线性分类转化成非线性分类。
上图是癌症发病的预测数据集,红色点代表癌症。我们可以看到,在二维平面上无法线性分类的数据,如果将其扩展到三维空间的话,我们也是可以用一个超平面将其分开。支持向量机是只能适用于线性分类模型的,所以这样做就可以使得一般数据集也可以用支持向量机模型。
值得一提的是,在升维过程中,我们一定可以找到一个维度的空间,使我们有限点集可以被超平面分开。这个定理强力支持了非线性支持向量机的可行性。因为只要维度足够多,数据集不会存在依旧不可线性分隔的可能。这如何理解呢?假如我们毫不吝啬,给每一个数据样本都分配一个维度,那么这些数据一定可以被超平面分开。只是可能需要上百万维度的计算量,但至少理论可行。
我们通过一个例子来解释一下升维的作用。
升维的操作过程
在这个图中,我们想要将红色与蓝色分隔开来。线性分类不可行,使用一个椭圆形的分类比较好。类似这样的:
我们设定横坐标为,纵坐标为
,那我们可以得到这条分隔线的函数为:

这里的为系数。那我们现在可以这样做,我们令
,并且由
构建新的坐标系的坐标轴.那我们得到一个五维的映射空间,而原来特征空间只有两维
。在这新的五维空间中,我们可以看出这个椭圆形分隔线函数为:

这是一个分割超平面的方程,是一个线性方程。那么我们便很容易看出,通过这一次由到
的映射,我们成功使用升维的办法,将非线性分类问题转化成线性分类问题。
效果如图:
不过很多朋友因此就认为核函数的作用就是将数据升维,达到用线性代替非线性的目的。
其实不然。
升维其实是一种解决办法,但是我们很容易发现其致命缺点——维度灾难。导致计算量难以解决。那么有什么办法既能够达到升维的效果,又可以避免升维的计算量呢?
有,核函数的思想。
值得注意的是,核函数和核技巧是一个独立的思想,并不是SVM所拥有的一个小部分。只是核函数和核技巧在SVM里面的用法十分有名而已。
具体如何操作,我们还看这个例子。
核函数
我们回到上一节所讲的支持向量机的对偶问题中来,我们知道,带有软间隔的支持向量机的对偶问题写成:



我们发现这里面是待求项,
只是一个正负类标记,只取{-1,+1}.所以我们训练数据的核心步骤就是使用这个
。
核函数的作用
我们由上面的例子作为铺垫,对于一般二次多项式情况。我们有一个数据集特征分布在维空间,
是其特征维度。那我们可以将其升维到这个空间:
![\Phi(x)=[1,x_1,x_2,...,x_d,x_1^2,x_1x_2,...,x_1x_d,x_2x_1,x_2^2,...,x_2x_d,...,x_d^2]](https://i-blog.csdnimg.cn/blog_migrate/85bb33c4f3f1a0c7e82848a5fd228ca6.png)
那么这时候对于对偶问题,我们就要转换到高维空间去计算了,所以我们有这个:
![\min_\alpha \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j[(\Phi(x_i)\cdot \Phi(x_j)]-\sum_{i=1}^N \alpha_i](https://i-blog.csdnimg.cn/blog_migrate/d8895b14a4410edd017230bbce3ade9f.png)
如果我们按照正常思路来解决的话,首先得求出:

这里的计算量是。在
很大的情况下,耗费还是很可观的。我们接下来论证核函数的威力:
我们需要注意的是,这里的和之前的
不一样,我们有
可能有些朋友对那个一撇不太理解,其实很容易,
自己对自己的内积,自行算一下便懂了。
我们转换一下:

那我们便可知:

这让我们可以得知,的计算可以由
计算出。而
的计算复杂度为
。核函数的作用是大幅度减少计算量,原理就在这一地方。接下来介绍核函数的形式。
核函数与核技巧的定义
我们将定义成核函数,并且定义
为映射函数。
核技巧的思想是:在学习和预测中只使用,而并不使用或者显式计算
。这也是我们为什么要打包
成为一个函数的原因。因为我们只在使用这个
的时候才可以体会到核技巧的便捷。
当然核技巧是一直要用下去的,否则的话贡献太小了。所以我们接着计算得出:

分类决策函数为:

非线性支持向量机学习算法
输入:训练数据集
,其中,
输出:分类决策函数。
- 选取适当的核函数
和适当的参数
,构造并求解最优化问题:
![]()
![]()
![]()
求得最优解
- 选择
的一个分量
适合条件
,计算:
![]()
构造分离决策函数:
![]()
正定核
上面算法很漂亮的解释了非线性支持向量机学习的全过程,可是有一点大家可能想到了。这个核函数是自己选的?不是数据本身性质决定的?那我们要怎么选这个核函数呢?
答案还真是自己选的。我们根据自己选用的核函数,来决定将原数据映射到什么样的空间。
我们的是由映射函数内积而成:
,因此他是一个对称函数。反过来说,我们对于一个函数
,如果其
矩阵是半正定的,那么一定可以找到一个与之对应的映射
。
矩阵如下所示:

我们有如下定理:*令为输入空间,
为定义在
上的对称函数,则:
可以作为核函数
为半正定
看起来过程很完美,但是让我们自己"造"一个核函数也是相当困难的,我们要论证Gram矩阵的半正定性,计算过程很复杂。所以我们一般有这么几个成熟的核函数可以调用。够我们解决不同场景的问题了。
几种常用核函数

我们还可以组合这些核函数。
- 若
和
为核函数,则对于任意正数
,线性组合
也是核函数。
- 若
和
为核函数,则函数的直积
也是核函数:
- 若
为核函数,则对于任意函数
,
也是核函数
当然,我们确定好核函数之后,便有了分类决策函数:

对于核函数如何选择的问题,吴恩达教授是这么说的:
- 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
- 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
- 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况