前言
好久没写,是因为觉得SVM实在是一个太庞大的东西,不知道该从何写起,也不知道能不能写好。但是最终还是觉得要写出来。
写在最前面,是想强调一点:
线性分类、逻辑回归当中,我们知道最终的分界面是一个平面,在二维当中说,也就是一条直线,但是有时候我们想得到一个非线性的分类边界怎么办呢?
这就引出了神经网络和SVM。
简要的提一下神经网络,在08年的时候,神经网络并没有那么火,09年深度学习概念火起来,极大的促进了神经网络。在08年的时候,吴恩达老师居然只是带过了一下,嘻嘻。
举个最简单的例子:
图1 神经网络
可以看到在图1左边,最终的表达式中,使用sigmoid函数时,分离平面是,此时已然是线性关系,但是当我们多加一层隐藏层时,便不再是线性关系。
SVM
另一种有效构建非线性边界的方法便是大名鼎鼎的支持向量机(SVM)了。
在逻辑回归中,其实我们依然是当时,预测为1,反之预测为0。自然而然的,我们就会想到,如果我们能使正样本预测的时候得到,负样本那就好了 ,所以也是自然而然的就得到了能够使得正负样本尽可能分开的思想。
SVM可以分为三种类型:线性可分、线性支持、非线性支持。
线性可分是最简单的形式,后两种都是在线性可分的基础上进行的扩展。我会分这三个部分来讲。
但是我最开始想讲的是一点数学知识,不然穿插着讲会比较乱。
一般化的拉格朗日乘数法
对于一个优化问题,我们常常伴随着一些约束。形式可以表达如下:
这比我们高中时候学过的拉格朗日乘数法多了小于等于的约束条件。我们按照高中时候的做法,构造函数:
同时,定义
接下来,证明原问题等价于
首先讨论,当,那么在最大化时,因为,则,所以最大化,等价于约束了。同理,则可令与同号,使得,所以最大化,等价于约束了。因此原问题等价于,即
对偶问题定义
定义
称为的对偶问题,一般有
当满足KKT条件时,有
而在KKT条件中,我们需要注意的是有一个条件是使得,一般情况下,两者不会同时为0。
求最大化或者最小化问题时,方法与高中学的拉格朗日乘数法一致。
有了上述数学知识作为背景,我们就可以愉快的推导SVM了。
之前我们也说过了,SVM的思想是找到一个超平面,该超平面能够将数据点分开,且不同类数据点间隔最大。见图:
在图中,我们可以认为红色是分类效果是最好的。
那既然有间隔,那我们就要去定义间隔怎么计算。
这就引出了函数间隔、几何间隔。
如感知器算法中一样,讨论二分类算法,令,当时,预测为1,反之预测为0。在SVM中,我们希望类别为1的数据点的远远大于0,类别为0的数据点远远小于0,从而使得两类数据点分的越远越好。
记住是分离超平面。
那么函数间隔定义为,当分类正确时,函数间隔会大于0,反之会小于0。且越大,函数间隔也越大。可以将的值看成是分类的确信度。
定义一个超平面关于一个训练样本集的函数间隔为:
很明显,当都增大相同倍数时,分离超平面是不变的,但是函数间隔却会放大为对应的倍数。所以函数间隔并不是一个有效的度量间隔的一种方式。
根据点到直线的距离公式,当平面为时,某一个点到平面的距离应该等于:
上述是一种理解式,在吴恩达老师的课堂上,他是这样讲的:
图中公式A,B分别代表对应点的坐标。
则将该距离定义为几何间隔(其实就是实际上我们高中学的点到直线的距离)。
则有
同样,定义一个超平面关于一个训练样本集的几何间隔为:
同样,几何间隔为正时,表示分类正确。
明确一个目的:SVM集中于使得超平面对于分类间隔最大,等价于最小几何间隔最大(因为不会任何一个点的几何距离小于几何间隔)。
也就是说,SVM可以转化为以下优化问题:
因为,代入上式,可得
由于函数间隔正比于,我们可以对做约束,使得,因此等价于:
转化为最小化问题:
综上,接下来我会从三个方面来讲SVM:线性可分,线性支持,非线性支持。
线性可分SVM
何为线性可分,来张图:
线性可分情况
通俗的来说,也就是我们可以用一条直线将不同类别的数据点完全分开,称为线性可分。
有人可能就要问了,我们不是用SVM来导出非线性边界的吗?
当然,SVM是不仅可以导出线性边界,也可以导出非线性边界。
非线性边界由线性边界导出,所以我们当然要先讨论简单的啦。
看到上面的最小化优化问题,很明显,将约束条件的不等号变个方向,就满足我们一般化拉格朗日乘数法的形式,这是这里没有的约束而已。
我们可以通过求解原问题的对偶问题进行求解:(有人可能要问为什么要用对偶形式求解,其实并不一定的,可参见回答)
至此,我们会发现若求解出来,我们的所有点是可以使得函数间隔大于等于1的,这就是线性可分的含义。
但是,如果找不到一组解,使得所有点的函数间隔大于等于1呢?
这就引出了我们的线性支持和非线性支持,两者的区别仅在于数据是不是基本线性可分,若基本线性可分,我们还是可以沿用线性可分的情况,对其有所改进,否则就得用非线性支持方法啦。
线性支持SVM
假设我们的数据如下图所示:
线性支持
我们可能更想要得到实线的分离超平面,而不是认为其无法分类,在图中我们可知,线性分类器是无法将其正常分离的,也就是说,此时样本近似可分,但是却不是完全线性可分的。
抑或出现如下这种情况:
线性支持
在这个图形中,虚线是能够完全分离开样本的,但是我们不希望为了某些个别样本大幅度旋转我们的超平面,说不定某些点是异常值呢?
针对于这些情况,我们就可以使用线性支持向量机。
其优化问题变成:
我们可以做如下理解:(仍然使得函数间隔为1)
若,若.
当时,,样本会落间隔边界内部,若时,,则允许样本错分。但是并不鼓励分类器进行这种做法,所以我们要使得所有尽可能小,也就是尽可能的偏向于0,所以在目标式中加入了后面的惩罚项。
同样我们采用一般化的拉格朗日乘数法,进行对偶问题求解:
最终根据KKT条件可做判断如下:
上述摘自博客
至此,我们便求出了线性支持向量机的分离超平面。
可以从和和,可得上述结论。
非线性支持SVM
终于来到了我们的重头戏,非线性边界啊!!
假设我们的数据如图所示:
这样我们用简单的线性分类器是不可能做到准确度较高的分类的,这个时候就需要一个f非线性边界了
在上述的求解过程笔记中,可以看到
最终我们的目标求解都可以化成:
可以看到,而最终,求时,依然只用到。
综上,不论是在我们求解的过程当中,还是最终的求解式当中我们都只用到内积式子,所以我们就想,能不能找到一个一个函数,右边是一个内积,如果直接计算右边式子,不仅要计算,还要计算乘法,太复杂,如果可以直接表示成一个函数,那么我不就可以直接将值代入中就可以。
对应到SVM中,既然当前数据在当前平面内不可分,我可以选择一个函数,对各个数据点进行映射,映射到另一个空间当中,使得它对另一个空间当中线性可分,或者说接近线性可分,那样我们就可以沿用线性支持向量机对其进行计算了。也就是说,对于每一个,我们进行映射,使得。
那么在之前的求解当中以及目标函数当中,涉及到的内积,若我们找到,便可以大大简化我们的计算,同时我们不必显式知道究竟是什么。
我们将成为核函数,原始求解目标可以转化为:
接下来,我们便可以在新的映射空间当中,对数据运行线性支持向量机算法。
判定一个函数是否为核函数,有定义可查,请读者自行查阅。
当我们的应设函数是一个非线性函数时,则含有核函数的SVM是非线性分类模型。
这里例举几个常用的核函数
- 多项式核函数:
- 高斯核函数:
- 字符串核函数,请自行查阅。
其实这里还有一个问题,在我们选取核函数的时候如何保证在另一个空间数据线性近似可分?
嘻嘻,好像都是试探性的,使用常用的核函数进行试探。