非线性支持向量机是最能够实用的支持向量机模型。核函数的使用是此模型的一大亮点。但是我在学习的过程中,发现很多网上的教程对有些概念没有强调说明,致使初学者包括当时的我容易混淆概念或者是不理解公式所云。我想一步步给大家展示一下核函数的详细内容。
本节算是支持向量机理论中比较高阶的了。有刚接触的朋友顺便可以看看《初阶的支持向量机》,或者《进阶的支持向量机》。有详细的理论推导。支持向量机是少数的有完备数学证明的机器学习模型之一。
升维处理问题
这个问题我相信大家都很清楚。在我们的数据集不能使用线性分类器完美分类的情况下,我们视不同情况有两种解决办法:第一种是在误分类点在分类超平面附近且数量较少时,我们使用带有软间隔的支持向量机,第二种是数据集误分类点很多,以致于线性分类器无法取得很好的效果的情况下,我们使用提升维度的方法来将线性分类转化成非线性分类。
上图是癌症发病的预测数据集,红色点代表癌症。我们可以看到,在二维平面上无法线性分类的数据,如果将其扩展到三维空间的话,我们也是可以用一个超平面将其分开。支持向量机是只能适用于线性分类模型的,所以这样做就可以使得一般数据集也可以用支持向量机模型。
值得一提的是,在升维过程中,我们一定可以找到一个维度的空间,使我们有限点集可以被超平面分开。这个定理强力支持了非线性支持向量机的可行性。因为只要维度足够多,数据集不会存在依旧不可线性分隔的可能。这如何理解呢?假如我们毫不吝啬,给每一个数据样本都分配一个维度,那么这些数据一定可以被超平面分开。只是可能需要上百万维度的计算量,但至少理论可行。
我们通过一个例子来解释一下升维的作用。
升维的操作过程
在这个图中,我们想要将红色与蓝色分隔开来。线性分类不可行,使用一个椭圆形的分类比较好。类似这样的:
我们设定横坐标为,纵坐标为
,那我们可以得到这条分隔线的函数为:
![f(x_1,x_2)=a_1x_1+a_2x_2+a_3x_1^2+a_4x_2^2+a_5x_1x_2+a_6](https://i-blog.csdnimg.cn/blog_migrate/f86a5fb3f5d42afe9feceab05469ac67.png)
这里的为系数。那我们现在可以这样做,我们令
,并且由
构建新的坐标系的坐标轴.那我们得到一个五维的映射空间,而原来特征空间只有两维
。在这新的五维空间中,我们可以看出这个椭圆形分隔线函数为:
![f(z_1,z_2,z_3,z_4,z_5)=a_1z_1+a_2z_2+a_3z_3+a_4z_4+a_5z_5+a_6](https://i-blog.csdnimg.cn/blog_migrate/bab25611f52ef6e73a244da9375d03c6.png)
这是一个分割超平面的方程,是一个线性方程。那么我们便很容易看出,通过这一次由到
的映射,我们成功使用升维的办法,将非线性分类问题转化成线性分类问题。
效果如图:
不过很多朋友因此就认为核函数的作用就是将数据升维,达到用线性代替非线性的目的。
其实不然。
升维其实是一种解决办法,但是我们很容易发现其致命缺点——维度灾难。导致计算量难以解决。那么有什么办法既能够达到升维的效果,又可以避免升维的计算量呢?
有,核函数的思想。
值得注意的是,核函数和核技巧是一个独立的思想,并不是SVM所拥有的一个小部分。只是核函数和核技巧在SVM里面的用法十分有名而已。
具体如何操作,我们还看这个例子。
核函数
我们回到上一节所讲的支持向量机的对偶问题中来,我们知道,带有软间隔的支持向量机的对偶问题写成:
![\min_\alpha \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j(x_i \cdot x_j)-\sum_{i=1}^N \alpha_i](https://i-blog.csdnimg.cn/blog_migrate/2ab7400e9545488f92fd696fed305f8f.png)
![s.t. \qquad\sum_{i=1}^N \alpha_i y_i=0 \qquad \quad](https://i-blog.csdnimg.cn/blog_migrate/9c003e1e69ac9ec71b319c30057b2906.png)
![\qquad \qquad \qquad \qquad 0 \leq \alpha_i \leq C \quad i=1,2,...,N](https://i-blog.csdnimg.cn/blog_migrate/d46a24e492c10027982bf0c06f59aadd.png)
我们发现这里面是待求项,
只是一个正负类标记,只取{-1,+1}.所以我们训练数据的核心步骤就是使用这个
。
核函数的作用
我们由上面的例子作为铺垫,对于一般二次多项式情况。我们有一个数据集特征分布在维空间,
是其特征维度。那我们可以将其升维到这个空间:
![\Phi(x)=[1,x_1,x_2,...,x_d,x_1^2,x_1x_2,...,x_1x_d,x_2x_1,x_2^2,...,x_2x_d,...,x_d^2]](https://i-blog.csdnimg.cn/blog_migrate/85bb33c4f3f1a0c7e82848a5fd228ca6.png)
那么这时候对于对偶问题,我们就要转换到高维空间去计算了,所以我们有这个:
![\min_\alpha \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N \alpha_i \alpha_j y_i y_j[(\Phi(x_i)\cdot \Phi(x_j)]-\sum_{i=1}^N \alpha_i](https://i-blog.csdnimg.cn/blog_migrate/d8895b14a4410edd017230bbce3ade9f.png)
如果我们按照正常思路来解决的话,首先得求出:
![\Phi(x_i) \cdot \Phi(x_j)=1+\sum_{i=1}^d \sum_{j=1}^dx_ix_j+\sum_{i=1}^d\sum_{i=1}^d x_i x_j x_i^\prime x_j^\prime](https://i-blog.csdnimg.cn/blog_migrate/208c9fa19c38f8c14ef20f41f038bf49.png%3D1%2B%5Csum_%7Bi%3D1%7D%5Ed%20%5Csum_%7Bj%3D1%7D%5Edx_ix_j%2B%5Csum_%7Bi%3D1%7D%5Ed%5Csum_%7Bi%3D1%7D%5Ed%20x_i%20x_j%20x_i%5E%5Cprime%20x_j%5E%5Cprime)
这里的计算量是。在
很大的情况下,耗费还是很可观的。我们接下来论证核函数的威力:
我们需要注意的是,这里的和之前的
不一样,我们有
可能有些朋友对那个一撇不太理解,其实很容易,
自己对自己的内积,自行算一下便懂了。
我们转换一下:
![\Phi(x_i) \cdot \Phi(x_j)=1+ \sum_{i=1}^d \sum_{j=1}^dx_ix_j+\sum_{i=1}^d\sum_{i=1}^d x_i x_j \sum_{i=1}^d\sum_{i=1}^dx_i^\prime x_j^\prime](https://i-blog.csdnimg.cn/blog_migrate/208c9fa19c38f8c14ef20f41f038bf49.png%3D1%2B%20%5Csum_%7Bi%3D1%7D%5Ed%20%5Csum_%7Bj%3D1%7D%5Edx_ix_j%2B%5Csum_%7Bi%3D1%7D%5Ed%5Csum_%7Bi%3D1%7D%5Ed%20x_i%20x_j%20%5Csum_%7Bi%3D1%7D%5Ed%5Csum_%7Bi%3D1%7D%5Edx_i%5E%5Cprime%20x_j%5E%5Cprime)
那我们便可知:
![\Phi(x_i) \cdot \Phi(x_j)=1+ x_i \cdot x_j + (x_i \cdot x_j)^2](https://i-blog.csdnimg.cn/blog_migrate/208c9fa19c38f8c14ef20f41f038bf49.png%3D1%2B%20x_i%20%5Ccdot%20x_j%20%2B%20%28x_i%20%5Ccdot%20x_j%29%5E2)
这让我们可以得知,的计算可以由
计算出。而
的计算复杂度为
。核函数的作用是大幅度减少计算量,原理就在这一地方。接下来介绍核函数的形式。
核函数与核技巧的定义
我们将定义成核函数,并且定义
为映射函数。
核技巧的思想是:在学习和预测中只使用,而并不使用或者显式计算
。这也是我们为什么要打包
成为一个函数的原因。因为我们只在使用这个
的时候才可以体会到核技巧的便捷。
当然核技巧是一直要用下去的,否则的话贡献太小了。所以我们接着计算得出:
![b^*=y_j -\sum_{i=1}^Ny_i\alpha_i^*(\Phi(x_i) \cdot \Phi(x_j) )=y_j -\sum_{i=1}^Ny_i\alpha_i^*(\kappa(x_i,x_j))](https://i-blog.csdnimg.cn/blog_migrate/bc6727f2b129f963aa0a20bee2d9797b.png)
分类决策函数为:
![f(x)=sign \left( \sum_{i=1}^{N_s} \alpha_i^*y_i \Phi(x_i) \cdot \Phi(x_j)+b^* \right )=sign \left( \sum_{i=1}^{N_s} \alpha_i^*y_i \kappa(x_i,x_j)+b^* \right )](https://i-blog.csdnimg.cn/blog_migrate/ad6b21d2e3e5f4da63a3a94dcf5c6002.png)
非线性支持向量机学习算法
输入:训练数据集
,其中,
输出:分类决策函数。
- 选取适当的核函数
和适当的参数
,构造并求解最优化问题:
![]()
![]()
![]()
求得最优解
- 选择
的一个分量
适合条件
,计算:
![]()
构造分离决策函数:
![]()
正定核
上面算法很漂亮的解释了非线性支持向量机学习的全过程,可是有一点大家可能想到了。这个核函数是自己选的?不是数据本身性质决定的?那我们要怎么选这个核函数呢?
答案还真是自己选的。我们根据自己选用的核函数,来决定将原数据映射到什么样的空间。
我们的是由映射函数内积而成:
,因此他是一个对称函数。反过来说,我们对于一个函数
,如果其
矩阵是半正定的,那么一定可以找到一个与之对应的映射
。
矩阵如下所示:
![Gram \quad K= \begin{bmatrix} \kappa(x_1,x_1) & ... & \kappa(x_1,x_j) & ... & \kappa(x_1,x_m) \\ \cdot & ... & \cdot & ... & \cdot \\ \kappa(x_i,x_1) & ... & \kappa(x_i,x_j) & ... & \kappa(x_i,x_m) \\ \cdot & ... & \cdot & ... & \cdot \\ \kappa(x_m,x_1) & ... & \kappa(x_m,x_j) & ... & \kappa(x_m,x_m) \\ \end{bmatrix}](https://i-blog.csdnimg.cn/blog_migrate/b7046ec14b14e92ce7b4aec1f0c3585a.png%20%5Cquad%20K%3D%20%5Cbegin%7Bbmatrix%7D%20%0A%5Ckappa%28x_1%2Cx_1%29%20%26%20...%20%26%20%5Ckappa%28x_1%2Cx_j%29%20%26%20...%20%26%20%5Ckappa%28x_1%2Cx_m%29%20%5C%5C%20%0A%5Ccdot%20%26%20...%20%26%20%5Ccdot%20%26%20...%20%26%20%5Ccdot%20%5C%5C%20%0A%5Ckappa%28x_i%2Cx_1%29%20%26%20...%20%26%20%5Ckappa%28x_i%2Cx_j%29%20%26%20...%20%26%20%5Ckappa%28x_i%2Cx_m%29%20%5C%5C%20%0A%5Ccdot%20%26%20...%20%26%20%5Ccdot%20%26%20...%20%26%20%5Ccdot%20%5C%5C%20%0A%5Ckappa%28x_m%2Cx_1%29%20%26%20...%20%26%20%5Ckappa%28x_m%2Cx_j%29%20%26%20...%20%26%20%5Ckappa%28x_m%2Cx_m%29%20%5C%5C%20%0A%5Cend%7Bbmatrix%7D)
我们有如下定理:*令为输入空间,
为定义在
上的对称函数,则:
可以作为核函数
为半正定
看起来过程很完美,但是让我们自己"造"一个核函数也是相当困难的,我们要论证Gram矩阵的半正定性,计算过程很复杂。所以我们一般有这么几个成熟的核函数可以调用。够我们解决不同场景的问题了。
几种常用核函数
![\begin{array}{c|lcr} 名称 & \text{表达式} & \text{参数} \\ \hline 线性核 & \kappa(x_i,x_j)=x_i^Tx_j & 无 \\ 多项式核 & \kappa(x_i,x_j)=(x_i^Tx_j)^d & d \geq1为多项式次数 \\ 高斯核 & \kappa(x_i,x_j)=exp(-\frac{||x_i-x_j||^2}{2\sigma^2}) & \sigma >0为高斯核带宽 \\ 拉普拉斯核 & \kappa(x_i,x_j)=exp(-\frac{||x_i-x_j||^2}{\sigma}) & \sigma>0 \\ Sigmoid 核 & \kappa(x_i,x_j)=tanh(\beta x_i^Tx_j+\theta) \qquad &tanh为双曲正切函数,\beta >0,\theta<0 \\ \end{array}](https://i-blog.csdnimg.cn/blog_migrate/e5c9ddc4cc9fd798e422d6acc7ceaaa4.png)
我们还可以组合这些核函数。
- 若
和
为核函数,则对于任意正数
,线性组合
也是核函数。
- 若
和
为核函数,则函数的直积
也是核函数:
- 若
为核函数,则对于任意函数
,
也是核函数
当然,我们确定好核函数之后,便有了分类决策函数:
![f(x)=sign \left( \sum_{i=1}^{N_s} \alpha_i^*y_i \kappa(x_i,x_j)+b^* \right )](https://i-blog.csdnimg.cn/blog_migrate/35a1cb2bae4fe2bfceaabba9b3b73af4.png)
对于核函数如何选择的问题,吴恩达教授是这么说的:
- 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
- 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
- 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况