最近一直在看SVM的一些论文,想做一下总结,因为发现以前看过的有关SVM的博客大多数都没有说的很清楚(反正我是还有细节没有搞懂),希望这篇文章能给一些人带来帮助,但主要是用来总结吧。
首先说SVM的来源。SVM是一个线性分类器,最开始的想法是要建立出一个比较稳定的线性分类器,由此便从几何上给出了一个使得间隔最大化的模型,当然,假设数据是线性可分的。
1. 我们先说说什么是线性可分的数据。我们假设数据有两类,C1和C2。这两类中的数据点的特征(feature)都是n维的,所以我们可以将这些数据点都放在R^n空间中,再进行考虑,当然,假如维数不同,那么我们取最大的维数作为n即可。线性可分指的是我们可以找到一个超平面,使得C1和C2的数据点被这个超平面隔离开来。label为了方便起见,取为+1, -1,这在下面的讨论中起到了不少的简化作用。
在中,超平面是一个n-1维的仿射空间,是一个n-1维子空间的平移,我们可以通过一个方程的解集来表示一个超平面
,这是线性函数
的零点集合,而且我们可以通过
这个n + 1维的向量来确定一个超平面。当然,对于一个超平面,并不只有唯一一个
与之对应,
对应的超平面都是相同的,而对应于相同超平面的这个集合
是
中的一条除去0的直线,是一个一维子空间除去0。总而言之,
中的超平面和
中的一条直线之间有一个一一对应。从几何上来看,w是超平面的法向量,而
表示了原点到超平面的距离,从这一个意义下来看,上述讨论也是很合理的,因为
即不改变向量所在的直线,也不改变原点到超平面的距离。
下面来说如何描述“隔离开”。上面说到超平面是线性函数的零点集合,而与那个超平面相对应的半空间就是线性函数大于0的集合,从低维情形下很容易看出来半空间就是超平面一边的点的集合。任取超平面上的一点,任取半空间中的一点
。由于
,所以有
,推出
,也就是说向量
与
是在同一侧的(夹角小于90度),这是其几何意义。所以,“隔离开”可以描述为C1和C2的点在不同的半空间中。根据我们对数据的假设,我们定义数据集是(严格)线性可分的,当且仅当 存在
,使得
,对所有的样本都成立。
2.再说说什么是线性分类器。最简单的情况,在二分类的时候,线性分类器就是找到一个函数,使得对于C1中的点,
,对于C2中的点,
,也就是找到一个超平面去将不同的数据点隔离开,由线性可分的定义,存在性是显然的。当然,从机器学习的角度,线性分类器是一个分类器,关于参数
在某种程度上是线性的,目标是让损失函数最小化,我们在这里考虑最简单的情况,直观上很好理解。
3.好的线性分类器,也就是好的超平面。首先,这个超平面能将数据正确分开,而且,我们希望这个分类器具有鲁棒性,如何描述这一点就用到几何间隔这个概念了,“几何间隔”是 离超平面最近的点的距离 ,而我们可以让几何间隔最大化,来获得稳定的超平面,也就是好的超平面,这一点在其他文章中都有大量说明,这里就不细说。
4.下面开始正题,我们的目标已经确定,获得几何间隔最大化的超平面,这可以写作下面的式子
或者写成下面的式子:
其中对应一个超平面,见上面的讨论。
就是几何间隔,
是点xi到超平面的距离。具体来说,我们假设超平面的法向量w同侧的label都为+1,不同侧的都为-1,所以原本点xi到超平面的距离为
,在这个假设下可以写为
。
由于我们的目标只是获得一个超平面即可,所以我们可以对每一个超平面用一个向量去表示就可以了,而不是用一个子空间去表示。一种方法是,我们限制,这样,对于每个子空间,我们都有一个
与之对应。就是当
时子空间中的那个向量
的前n个分量组成的向量和第n+1个分量,它们分别组成了
,这样得到的w模长为1。而对于一个
,我们也有唯一的一个子空间与之对应,这样,我们在所有一维子空间与
(||w|| = 1)这两个集合间建立了一个一一映射。所以,优化问题可以写为:
看起来依然不好解,哪怕我们用松弛变量转化一下也很麻烦,这里就不细说。看另一种方法。
类似于第一种方法,我们只要能在子空间和单个向量之间建立一种对应关系,并且能够达到化简问题的目的就行了。
我们的目的是找到一个正确的分类超平面,所以,我们可以知道对于我们需要的,一定有几何间隔
这一等式成立,除此之外的
我们不用考虑,这样,我们将超平面的范围缩小了。这样,一定
,使得
,我们不妨假设这个下界C是达到的,也就是C是几何间隔。下面我们来寻找与子空间对应的向量,对于一个子空间
,我们取
,使得
,这可以通过让上面的不等式两边除以C达到,这种获得方式是惟一的,因为,我们知道,对于一个超平面,其几何间隔C是确定的,所以这种方法取得的向量为
,是唯一的。反之,给一个
,满足
,那么也有一个子空间与之对应。所以,我们又建立了一个一一对应,可以对问题进行化简了。在这种情况下,我们发现,对于满足约束的向量
,其几何间隔等于
,所以,化简如下:
这等价于
再等价于
这样,我们就得到了基本的SVM优化问题了。