核映射与核函数
通过核函数,支持向量机可以将特征向量映射到更高维的空间中,使得原本线性不可分的数据在映射之后的空间中变得线性可分。假设原始向量为x,映射之后的向量为z,这个映射为:
在实现时不需要直接对特征向量做这个映射,而是用核函数对两个特征向量的内积进行变换,这样做等价于先对向量进行映射然后再做内积:
在这里K为核函数。常用的非线性核函数有多项式核,高斯核(也叫径向基函数核,RBF)。下表列出了各种核函数的计算公式:
其中γ,b,d为人工设置的参数,d是一个正整数,γ为正实数,b为非负实数。
使用核函数后,支持向量机在训练时求解的对偶问题为:
其中为训练样本,为样本的特征向量,为类别标签,取值为,分别对应正样本和负样本,l为训练样本数。C为惩罚因子,用于对错误分类的训练样本进行惩罚,是一个人工设定的参数。在训练时,如果使用多项式核,需要指定的参数为核函数参数γ,b,以及d。如果选用高斯核,需要指定的参数为γ。无论使用哪种核函数,训练时都要指定惩罚因子C,这是一个大于0的实数。预测时的分类判别函数为:
其中sgn为符号函数,定义为:
实验
支持向量机真的能对非线性的数据进行分类吗?不同的训练参数会对分类结果产生什么样的影响?下面我们用一个小实验来验证。在这里,我们对二维平面上512x512像素的图像中的所有点进行分类,有蓝色和红色两类。先用一批样本训练一个模型,然后对平面内所有的点进行分类,分类结果的颜色和训练样本的颜色相同。
首先来看支持向量机能否处理异或问题,这是人工智能里一个很经典的分类问题,两类训练样本分别落在两个对角线上:
显然,用一条直线无论怎样划分都无法将这两类样本正确的分开。下面来看SVM的表现,我们使用线性核,多项式核,高斯核三种核函数进行训练。
首先选用线性核,结果是这样的:
所有样本都被判定成红色。不出所料,使用线性核的SVM是无法解决异或问题的。
接下来选用多项式核。首先将参数设置为:
分类效果非常差:
蓝色的样本只有少数被分对了。下面调整训练参数:
这里只加大了惩罚因子C的子,分类效果如下:
这比之前好了,蓝色的样本有一半被分对。接着调整参数:
分类效果如下:
现在是见证奇迹的时刻!所有训练样本都被正确分类,看来加大C的值非常有效。
下面来看高斯核的表现,如果参数设置为:
分类效果也是非常差:
所有的点都被分成了红色。下面加大惩罚因子的值:
大部分训练样本都可以正确分类:
进一步加大C的值:
效果比刚才更好,所有样本基本上都被正确分类了。
继续调整,加大C的值:
所有样本都被正确分类。
如果我们只加大γ的值,也能达到很好的效果:
所有样本同样被正确分类。
结论
通过上面的实验我们发现使用多项式核、高斯核的SVM确实是可以解决线性不可分问题的。不同的参数对精度的影响非常大,一般来说,C越大,训练得到的模型越准确。如果采用高斯核,参数γ的值对精度影响也非常大。因此,在实际应用时调一组好的参数对使用效果非常重要!
转载自: