浅谈SVM(四)
三、非线性 SVM
1、引子
这里形式的有趣之处在于,对于新点
注意到如果
2、核函数
这里
- 首先使用一个非线性映射将数据变换到一个特征空间
S ; -
然后在特征空间使用线性学习器分类。
由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示: f(x)=∑ni=1αiyi<Φ(xi),Φ(x)>+b
如果有一种方式可以在特征空间中直接计算内积<Φ(xi),Φ(x)> ,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算的方法称为核函数方法。下面来看个核函数的例子,如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢?
事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪声得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用X1 和X2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:a1X1+a2X21+a3X2+a4X22+a5X1X2+a6=0
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为Z1=X1,Z2=X21,Z3=X2,Z4=X22,Z5=X1X2 ,那么显然,上面的方程在新的坐标系下可以写作:∑5i=1aiZi+a6=0
关于新的坐标Z ,这正是一个超平面方程。也就是说,如果我们做一个映射Φ:R2→R5 ,将X 按照上面的规则映射为Z ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。核函数相当于把原来的分类函数: f(x)=∑ni=1αiyi<xi,x>+b
映射成:f(x)=∑ni=1αiyi<Φ(xi),Φ(x)>+b
而其中的α 可以通过求解如下对偶问题而得到:⎧⎩⎨⎪⎪⎪⎪⎪⎪maxα∑ni=1αi−12∑ni,j=1αiαjyiyjxTixjs.t.αi≥0,i=1,2,...,n∑ni=1αiyi=0
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射Φ ,然后把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!刚才的方法其实有一个问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;如果原始空间是三维的,那么我们会得到19 维的新空间,这个数目是呈爆炸性增长的,这给Φ 的计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。此时就需要 Kernel 函数出马了。不妨还是从最开始的简单例子出发,设两个向量 x1=(η1,η2) 和x2=(ξ1,ξ2) ,而Φ 即是前面说的五维空间的映射,因此映射过后的内积为:<Φ(x1),Φ(x2)>=η1ξ1+η21ξ21+η2ξ2+η22ξ22+η1ξ1η2ξ2
我们又注意到(<x1,x2>+1)2=2η1ξ1+η21ξ21+2η2ξ2+η22ξ22+2η1ξ1η2ξ2+1
二者有很多相似的地方,实际上,只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射Φ(X1,X2)=(2√X1,X21,2√X2,X22,2√X1X2,1)T
之后的内积<Φ(x1),Φ(x2)> 的结果是相等的,那么区别在于什么地方呢?区别在于一个是映射到高维空间中,然后再根据内积的公式进行计算;而另一个则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果。我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数(Kernel Function)。例如,在刚才的例子中核函数为: K(x1,x2)=(<x1,x2>+1)2
核函数能简化映射空间中的内积运算,碰巧的是,在我们的 SVM 里需要计算的向量总是以内积的形式出现的。现在我们的分类函数为:f(x)=∑ni=1αiyiK(xi,x)+b
其中α 由如下对偶问题计算而得:⎧⎩⎨⎪⎪⎪⎪⎪⎪maxα∑ni=1αi−12∑ni,j=1αiαjyiyjK(xi,x)s.t.αi≥0,i=1,2,...,n∑ni=1αiyi=0
这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!当然,因为这里的例子非常简单,所以可以手工构造出对应于Φ(.) 的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。
下面我们来看看常用的核函数:
1.多项式核K(x1,x2)=(<x1,x2>+r)d
该空间的维度是(m+dd) ,其中m 是原始空间的维度。
2.高斯核K(x1,x2)=e||x1−x2||22σ2
这个核函数可以将原始空间映射为无穷维空间。不过,如果σ 选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果σ 选得很小,则可以将任意的数据映射为线性可分的数据。当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:
3.线性核K(x1,x2)=<x1,x2>
这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中 的问题”和“映射前空间中的问题”两者在形式上统一起来了。
问:既然有很多的核函数,针对具体问题该怎么选择?
答:对核函数的选择,现在还缺乏指导原则,各种实验的观察结果表明,某些问题用某些核函数效果很好,用另一些就很差,但是一般来说,径向基核函数(高斯核函数)是不会出太大偏差的一种,首选。
最后概括一下:
1.实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的;
2.但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的;
3.此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。