SVM之核函数

   SVM之问题形式化

   SVM之对偶问题

>>>SVM之核函数

   SVM之解决线性不可分

   写在SVM之前——凸优化与对偶问题

上一篇SVM之对偶问题中讨论到,SVM最终形式化为以下优化问题\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}<{{x}^{i}},{{x}^{j}}>}  \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0  \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0  \\\end{matrix} \right.  \\\end{matrix} \right.\end{align}\]

而且最终的判别式可以写成\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}<{{x}^{i}},x>}+b\end{align}\]

之前已对(1)的求解做了简单提及,需要注意的是,优化问题(1)虽然可以直接求解,但是要基于训练数据线性可分的基础,如果数据本身线性不可分呢?

解决方法之一就是将数据,或者更加正式的称为特征,向高维映射,以期待映射后数据在更高维的空间中数据可分,这样就可以在新的高维空间中继续使用之前的方法。

简单起见,考虑一维不可分的数据

显然,原始的一维数据是线性不可分的,现在取映射$\phi (x)=(x,{{x}^{2}})$ 将原始的一维数据映射到二维,数据变的线性可分了。这种向高维映射的方法一定程度上解决的线性不可分问题,但同时也带来了相当的计算复杂度。

SVM现在将在新的二维空间运行,原来问题中的$x$ 将用$\phi (x)$ 取代,优化问题中向量内积$<{{x}^{i}},{{x}^{j}}>$ 也将被$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$ 取代,判别函数中向量内积$<{{x}^{i}},x>$也将被$<\phi ({{x}^{i}}),\phi (x)>$取代,换句话说,我们需要将原来所有一维训练样本首先一个个计算,映射到新的二维空间,然后在二维空间中计算新样本之间的内积。这与原来直接在一维空间中直接计算一维向量内积相比,虽然并不会复杂多少,然而随着样本维度和映射后维度的增加,计算复杂的的提升是非常显著的,甚至变得不可计算。(这不是危言损听,比如高斯核将样本映射的无限维空间,那么怎么计算呢?)

已经说过,上面的过程是由两个步骤组成的。首先是映射,其次是计算映射后的内积。但其实我们真正需要的知道的只是映射后的内积,我们不需要$\phi (x)$ 、$\phi ({{x}^{i}})$ 、$\phi ({{x}^{j}})$ ,我们真正需要的是$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$和$<\phi ({{x}^{i}}),\phi (x)>$,这对优化问题(1)和判别函数(2)来说已经足够了。然而,怎么绕过映射本身而直接求解映射后向量内积呢?核函数就是用来做这样的事情。

核函数定义为 \[\begin{align}K(x,y)=<\phi (y),\phi (y)>\end{align}\]

以上核函数的定义应该来讲是“意义化”的,而不是“计算化”的,定义中出现$\phi (x)$ 、$\phi (y)$ 并不表明需要显式计算映射本身,而是来说明核函数的意义是映射后向量的内积,而核函数“计算化”的定义是需要我们自己设计给出的。

还是上面一维到二维的例子,考虑两个一维样本$x$和$y$ 映射到二维样本$\phi (x)=(x,{{x}^{2}})$ 和$\phi (y)=(y,{{y}^{2}})$,则\[\begin{align*}<\phi (x),\phi (y)> & ={{(x,{{x}^{2}})}^{T}}(y,{{y}^{2}}) \\& =xy+{{(xy)}^{2}} \\\end{align*}\]

那么,我们就可以定义对应的核函数为\[K(x,y)=xy+{{(xy)}^{2}}\],这和映射到二维后再计算内积的结果是一样的,但是现在直接计算$K(x,y)=xy+{{(xy)}^{2}}$使得我们不需要关心映射本身,而且计算是在原来的一维空间进行的。当样本维度增加时,这样方法带来的计算优势是不言而喻的。这就是核函数的主要作用,它隐藏映射本身而直接在低维空间计算高维空间向量的内积,显著降低计算复杂度。这简直就像加了特技,duang一下就完成了高维空间内积的计算,所以有些文献将核函数称为kernel trick,是trick,是特技!

那么,当我们需要将样本向高维空间映射以期望将数据变得线性可分时,怎样找到这种映射对应的核函数呢?上面一维到二维的示例过于简单,可以很方便的找到对应的核函数,当样本维度较高时,设计一个核函数并非易事。幸运的是,牛人们已经帮我们设计好了许多核函数,所以我们现在不需要根据映射去设计对应的精确的核函数,而是反过来选取设计好的核函数来尽可能满足我们的映射,保证映射后数据尽可能的线性可分。

常见的核函数有高斯核、多项式核、感知器核等。

高斯核:$K(x,y)=\exp (-\frac{{{\left\| x-y \right\|}^{2}}}{2{{\sigma }^{2}}})$

多项式核:$K(x,y)={{(<x,y>+c)}^{d}}$

感知器核:$K(x,y)=\tanh ({{\rho }_{1}}<x,y>+{{\rho }_{2}})$

这些核函数都对应不同的映射,拥有不同的性质。比如高斯核对应一个到无限维空间的映射,而且高斯核的意义比较明确:对原空间内相近的两个向量$x$、$y$计算 结果的数值较大,反之较小,参数$\sigma $ 控制这核函数值随${{\left\| x-y \right\|}^{2}}$变化的速度;多项式核对应一个到$C_{n+d}^{d}$ 维的映射。仅从这两个其他核函数的映射维度来看,核函数在降低计算复杂度上是很显著的,比如对多项式核,可以取$n$ (原样本维度)和$d$ 为不同值,看看映射后维度有多高。其他关于核函数本身的性质可以去查看专门的文献。作为一般应用,以上几个核函数可能在很多情况下已经够用了,而且高斯核应用最广。

已经选取好核函数之后,需要做到就是将原来的优化问题和判别函数中的向量内积用核函数替代,这样优化问题变为:\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}K(x{{,}^{i}}{{x}^{j}})}  \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0  \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0  \\\end{matrix} \right.  \\\end{matrix} \right.\end{align}\]

判别函数变为:\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}K({{x}^{i}},x)}+b\end{align}\]

现在我们去求解优化问题(4)后用判别式(5)对新样本分类。

需要注意,核函数不是SVM的专利,只是在SVM中的一个应用,其他所有存在向量内积的场景,如果需要都可以引人核函数。

核函数隐藏着一个到高维的映射,可能使得数据在高维变得线性可分,但并不保证映射后一定是线性可分的。那怎样彻底处理线性不可分的问题呢?其实可以换个思路,我们并不要求数据一定得线性可分,不过如果有些样本错分了,我们给它一个惩罚代价,并将惩罚代价引人优化目标,这样的话,虽然分类器不能保证对训练数据线性可分,但它会根据我们给出的惩罚因子找到代价最小的分类器。这个问题将在下一篇文章SVM之解决线性不可分中介绍。

posted @ 2015-03-23 17:46  Tswaf  阅读(4000)  评论(0编辑  收藏  举报