前面介绍的支持向量机都是在数据线性可分条件下的,但我们拿到训练数据时,并不一定能知道数据是否线性可分,低维数据可以通过可视化的方式观察是否线性可分,而高维数据则很难判断其是否线性可分了。对线性不可分数据强行构建线性支持向量机分类可能会导致很差的分类效果,本篇博文就介绍一下如何在数据线性不可分条件下构建非线性支持向量机。
1.非线性情况
在二维空间中,考虑如下一组数据
无论如何都找不到一条直线将两组数据(红色和蓝色的点)合理的分隔开,但是图中红色的圆能将这两组数据完美的分隔开,那按照线性SVM中最优分类超平面的思路,我们能不能找到一个最优的分类圆呢?在这个例子中我相信是可以的(尽管我没实践过),但一般情况下很难决定用什么几何特征来实现数据的分隔,一方面是因为无法有效的可视化这些数据,另一方面是因为在高维空间中很难定义几个几何图形,那这种情况下该怎么考虑?我们能不能将非线性特征转化为线性特征呢?答案是可以的,做法就是建立一个新的维度空间,并且定义新的坐标值,还是以圆为例,在二维空间中,圆的方程式为
我们建立一个新的5维空间,将该5维空间中每个坐标轴定义如下:
那么在这个新的5维空间中,圆的方程为:
这样,就成了超平面方程了。同样的,将原先的数据的坐标也映射到新的5维空间中,这样就成了线性可分的情况了,因此我们的优化目标就变成以下形式
(1)
式中函数表示数据点低维空间坐标映射到高维空间坐标的过程,这样就可以构建分类超平面实现分类了,不过在对数据点类别预测时,需要先将原先二维空间中的坐标映射到新的5维空间中,然后再分类。
2.核函数
将数据从当前维度空间映射到更高维的空间中确实是可以实现数据非线性分布到线性分布的转变,上面举的例子中是二维空间到五维空间的映射,现在再考虑一下三维空间中的数据如何映射到高维空间中实现线性化转变,三维空间中任意曲面的方程为:
按照前面的思路,我们需要将数据映射到19维空间中,这样才能保证数据分布一定能线性化。这里可以看到,维度的增长已经很明显了,如果我们的训练数据是100维、1000维的呢?按照这种映射方式,将会得到想象不到的维度爆炸问题,甚至无法映射。在公式(1)中,需要先将低维度空间中的数据映射到高维度空间中,然后再计算坐标的内积,这在维度爆炸的情况下会耗费大量的计算时间,因此将数据映射到更高维度空间、实现线性化的做法并不是一个可取的方法。
那怎么办呢?还是以2维空间到5维空间的映射过程为例,设2维空间中有两个向量,,则其映射后的内积为
(2)
然后我们找一个函数,使向量、输入后的结果与公式(2)相等,找来找去,发现找不到。。。尴尬了,但是找到了这样一个函数
输入、后,输出结果为
(3)
尽管公式(3)与公式(2)结果不同,但是很相近啊,只不过多了一个常数项,而且部分项的参数不同,那我们就用代替,放入到公式(1)中计算,计算的结果当然不是理想情况下的最优分类超平面了,但是和之前低维到高维映射的做法相比,这样做有一个极大的好处:省去了映射时每个轴坐标值的计算过程,节省了高维空间中内积的计算过程。在数据维度较大的情况下,和丢失一些分类准确性相比(当然,准确性丢失太多肯定是不行的,就看能否在你的接受范围内了),大大节省了建模的计算时间更可取。
好了,现在我们正式定义以下核函数:函数表示坐标从低维空间到高维空间的映射,如果存在一个函数满足
那么就称为核函数,核函数的作用上面也说了,和函数一样,都是为了简化计算过程,尽管得到的SVM可能不是理论上的最优结果。
3.常用的核函数
核函数固然作用大,但不是那么好找的,好在很多牛人帮我们找到了一些核函数,常用的有以下几个:
- 线性核函数
- 多项式核函数
其中参数、、均是可调的
- 高斯核函数,在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它
其中,参数,是可调的
4.小结
支持向量机系列讲到这里为止,主要的内容已经讲完了,包括如何将寻找最优分类超平面问题转化为凸优化问题,继而去求解凸优化问题,也讲到了不完全线性可分情况、非线性情况下寻找最优分类间隔问题与完全线性可分情况下寻找最优分类超平面间的联系,最终我们可以得到这样一个观点:不管训练数据分布如何,我们可以直接用非线性方法处理,选定一个核函数,求解分类间隔,在测试集上观察测试结果,然后调整核函数的参数,知道找到一组能满足分类准确率的参数。
唯一还遗留的一点内容是公式(1)中优化问题的快速搜索方法,这个我们在下一篇中说明。