我所理解的 SVM核函数的应用

来源:互联网 发布:js遍历数组的方法 编辑:程序博客网 时间:2024/06/10 17:06

我们通过乘数法得到了 \sum_{k=1}^m\alpha _iy^{(i)}=0, w =\sum_{k=1}^m\alpha _iy^{(i)}x^{(i)} ,现在我们把它们回带到 分界线 y=w^Tx+b :

\begin{split}y&=\sum_{k=1}^m\alpha _iy^{(i)}x^{(i)}x+b\\&=\sum_{k=1}^m\alpha _iy^{(i)}<x^{(i)},x>+b\\\end{split}

如果我们已经求得 \alpha_i和 b,那么 y 可以写成仅依赖于 x^{(i)} 和 x^{(j)} 的矢量积形式,这一点非常关键。很多时候我们需要从数据中挖掘新的特征来进行训练,而不是简单粗暴地用原始数据,比如我从 x中挖掘出新的特征 x^2, 我们需要再一步一步重新推导 y 的表达式吗?只需要将 <x^{(i)}, x> 换成 <(x^{(i)})^2,x^2>即可,更一般的:

如果存在一种映射关系 \phi(x),将 x 映射到另一空间中,已知 y=\sum_{k=1}^m\alpha _iy^{(i)}<x^{(i)},x>+b ,那么新空间中的 y=\sum_{k=1}^m\alpha _iy^{(i)}<\phi(x^{(i)}),\phi(x)>+b

整个过程非常的顺溜,\phi(x) 可以将数据从低维空间映射到高维空间中,为分类提供了新的视角,如下图所示,一维空间中的数据点 X 和 O 互相交杂,在一维空间中我们无法找到一个分界点进行划分,但是通过 \phi(x)=(x,0.5x^2+2) 映射到二维空间后,很容易找到分界线将这些不同类型的点区分开来。

映射函数 \phi 通常将低维的数据(m)映射到更高维的空间(n)中,使得线性区分变为了可能, 考虑到 m<<n,这引起的一个问题就是计算量随着维数的增加快速增大,但是我们又知道矢量点积的结果是一个数,怎么来简化这个操作呢?

在这里引入核函数(Kernel Function) K(x^{(i)},x^{(j)})=\phi(x^{(i)})\cdot \phi(x^{(j)}) ,此时 :

y=\sum_{k=1}^m\alpha _iy^{(i)}K(x^{(i)},x)+b\\

好像有点乱,让我们先来捋一捋:

x^{(i)}\cdot x^{(j)}\longrightarrow \phi(x^{(i)})\cdot \phi(x^{(j)}) =K(x^{(i)},x^{(j)})

映射函数 \phi 的作用是将低维空间的数据映射到高维空间中,核函数 K表示的是映射之后高维空间中两个矢量的点积。

通过映射函数,我们能从原始数据中(低维空间)抽象出所需的特征(高维空间),由低维空间向高维空间的转化很多时候非常的麻烦,有意思的是,无论是1维、10维、100维还是更高维的空间,其矢量点积的结果都是一个常数,那么有没有什么捷径,可以跳过维度转换的过程,通过相对简单的计算直接得到矢量积?答案就是核函数,还是举一个例子来说明吧:

令 x=[x_1, x_2, x_3]^T,y=[y_1, y_2, y_3]^T,我们定义 \phi(x)=[x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3] 将原始数据从三维空间映射到九维空间中,让我们来计算\phi(1,2,3) \cdot \phi(4,5,6)

$$

\begin{split}\phi(1,2,3)&=[1,2,3,2,4,6,3,6,9]^T\\\phi(4,5,6)&=[16,20,24,20,25,30,24,30,36]^T\\\phi(1,2,3) \cdot \phi(4,5,6) &=1\times16+2\times 20 + 3\times 24 + 2\times 20 + 4 \times 25 + 6 \times 30 + 3 \times 24 + 6 \times 30 + 9\times 36\\&=16+40+72+40+100+180+72+180+324\\&=1024\end{split}

可以看出计算相当繁琐,嗯,我们来尝试找找对应的核函数:

\begin{split}\phi(x)\cdot \phi(y)&=[x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3]^T\cdot [y_1y_1,y_1y_2,y_1y_3,y_2y_1,y_2y_2,y_2y_3,y_3y_1,y_3y_2,y_3y_3] \\&= x_1y_1x_1y_1+x_1y_1x_2y_2+x_1y_1x_3y_3+x_2y_2x_1y_1+x_2y_2x_2y_2+x_2y_2x_3y_3\\&+x_3y_3x_1y_1+x_3y_3x_2y_2+x_3y_3x_3y_3\\&=(x_1y_1+x_2y_2+x_3y_3)^2\\&=(x^Ty)^2\\&=K(x,y)\end{split}

通过上面的推导,我们发现虽然维度转化的过程较为繁琐复杂,但是矢量点积的结果确实相当简洁,这一次我们直接用核函数计算:

\begin{split}K(x,y)=K((1,2,3),(4,5,6))=(1\times 4 + 2\times 5 + 3\times 6)^2=(32)^2=1024\end{split}

相比于从低维映射到高维空间再进行矢量积运算,核函数大大简化了计算的过程,使得向更高维转化变为了可能,我们不需要知道低维空间的数据是怎样映射到高维空间的,我们只需要知道结果是怎么计算出来的。

5. 介绍两种核函数

在支持向量机中常用的几种核函数是多项式型核(Polynomial Kernel)、径向基函数核(Radial basis function kernel,又叫高斯核,简称 RBF)以及逻辑核( Sigmoid Kernel)。

- 多项式型

\begin{split}K(\mathbf{x},\mathbf{y})&=(\mathbf{x}^T\mathbf{y}+c)^d\\\end{split}

如果 \mathbf{x},\mathbf{y} 本身是 k 维空间的向量,多项式展开后可知该核函数对应的空间维度为 \tbinom{k+d}{d}=\mathrm{C}^{k+d}_d=O(k^d) ,计算复杂度随着维数增加呈指数爆炸,但是用核函数进行计算的复杂度为 O(k) 。

维数越高,偏差(bias)越低,方差(variance)越高,容易出现过拟合的情况,相反维数越低,偏差就会越大,但是方差会随之减小,一般不宜选择过高的维度,最适合的维度需要通过交叉验证(cross validation)等方法来确定,关于方差和偏差的分析,可以看看这篇博文

原创粉丝点击