之前的博客介绍了在数据为线性可分的情况下,如何用SVM对数据集训练,从而得到一个线性分类器,也就是超平面 WX+b=0 W X + b = 0 . 但是我已经强调过多次,线性可分的情况有相当的局限,所以SVM的终极目标还是要解决数据线性不可分的情况。解决这种线性不可分的情况基本的思路有两种:
- 加入松弛变量和惩罚因子,找到相对“最好”超平面,这里的“最好”可以理解为尽可能地将数据正确分类;
- 使用核函数,将低维的数据映射到更高维的空间,使得在高维空间中数据是线性可分的,那么在高维空间使用线性分类模型即可;
本篇博客的全部内容就是介绍这两种思路如何在数据线性不可分的情况下训练分类器的。
1. 松弛变量和惩罚因子
1.1 定义
所谓线性不可分,说得形象一些,就是“你中有我,或者我中有你”,我们找不到一个超平面,恰好能把两类数据严格地分开。举个例子,Fig.1(a)中,白色数据元组中有一个点比较“另类”(我用文字标了出来),它跑到人家黑色元组的区域中去了,显然,如果这个点直接被忽略掉,那么分类效果是很好的(比如Fig.1(a)中的蓝色虚线),但是现在的情况就让人很难受,因为我们找不到一个超平面,恰好能把黑白两类数据分开。

还有一种情况也比较有意思,就是现在数据还是线性可分的,比如Fig.1(b),但是存在一个“异常点”(SVM中称之为outlier),如果忽略它,最佳分离超平面的效果非常好,但是如果按正常的套路训练的话,我们只能得到一个“差强人意”的结果。如Fig.1(b)所示,有它或没它,超平面的训练效果是有很鲜明对比的。
针对上面这两种情况,最直接的解决思路就是能不能适当的放宽数据点和边缘侧面之间的关系?还记得之前线性可分情况下的约束条件是这样的:
现在放宽一些,变成下面的形式:
其中 ξi ξ i 为元组 Xi X i 对应的松弛变量,它实际上是这个元组距离它原本的边缘所超出的权重距离,也就是Fig.1两个子图中黑色虚线的权重长度(权重是 W W )。这样做的结果相当于是放宽了约束要求。通过在约束条件中加入松弛变量,使得一些原本不在相应边缘外部的点,被“拉”回了相应的侧面上,我给出松弛变量形式化的定义如下:
定义1-松弛变量:指数据元组关于侧面的离差的长度。离差有两种类型:
- 大离差:即某个类的元组直接到超平面的另一侧去了,像Fig.1(a)中的异常点,这时有离差的数据被错误分类了;
- 小离差:即某个类的元组没有到超平面的另一侧,但是落在了超平面本侧的边缘内,像Fig.1(b)中的outlier,这时有离差的数据未被错误分类;
从大小离差的定义,我们也能确定松弛变量的取值范围:大离差 ;小离差 1>ξi>0 1 > ξ i > 0 . 当然如果一个元组正确地落在它该在的位置上,那就是没有离差,即 ξi=0 ξ i = 0
离差的存在帮助我们在一定的容错率下获取最佳分离超平面,但问题在于目标函数中离差的大小如何确定?显然,如果太小了,分离超平面就计算不出来了,或者只能计算一个“不佳”的分离超平面;而如果太大了,那任何一个超平面都是分类器了,也不行。所以,一定要采取措施,“控制”松弛变量。
控制的方法是加入“惩罚因子”。定义惩罚因子之前,我们先定义“软误差”:
定义2-软误差:指所有数据元组的松弛变量的和, ∑ni=1ξi ∑ i = 1 n ξ i
定义3-惩罚因子:是一个大于0的系数(记为 C C ),软误差乘该系数后,加入目标函数,使之成为新的目标函数,如下:
其中 C C 的取值用来在数据拟合之间找到平衡。显然, 越大,则分类器越不愿意分类错误,它要按“最正确”的来,那就会得到一个过拟合的分类器;而如果 C C 越小,那么分类器就越“不在乎”错误,得到一个过于泛化的分类器,也就是欠拟合了。
1.2 求解新的优化问题
现在,加入松弛变量和惩罚因子后,新的优化问题诞生了,它是我在上一篇博客。。。的公式(1)的基础上加入松弛变量和惩罚因子的结果:
注意,这里 ξi≥0 ξ i ≥ 0 也是约束条件
拉格朗日方程变为:
其中, μi μ i 为新加入的拉格朗日乘子。
得到拉格朗日方程后,就可以进入我们在上一篇博客 SVM解释:三、线性可分的情况 中解决此类问题的“套路”了。具体地说,
现在的优化问题相当于求解:
转换成对偶问题:
先求解 minW,b,ξL(W,b,α,ξ,C,μ) min W , b , ξ L ( W , b , α , ξ , C , μ ) :
将以上的结果带入拉格朗日函数,那么对偶问题 d∗ d ∗ 就是要计算: