有些学习方法(如感知机)只需要找到任一线性分界面即可,而另一些方法(如NB)则需要按照某个准则找到最优的线性分界面。对于SVM而言,它定义的准则是寻找一个离数据点最远的决策面。
SVM算法的数学原理相对比较复杂,但是思想比较简单,就是通过某种核函数,将数据在高维空间里寻找一个最优超平面,能够将两类数据分开。
1、支持向量
从决策面到最近数据点的距离决定了分类器的间隔,这种构建方法意味着SVM的决策函数完全由部分的数据子集所确定,并且这些子集定义了分界面的位置。这些子集被称为支持向量(support vector)。
2、目标函数
例子:
要用一条直线,将下图中黑色的点和白色的点分开,很显然,图上的这条直线就是我们要求的直线之一(可以有无数条这样的直线)。
令黑色的点 类= -1, 白色的点 类 = +1
sgn表示符号函数,当f(x) > 0的时候,sgn(f(x)) = +1, 当f(x) < 0的时候sgn(f(x)) = –1。
Classifier Boundary就是f(x),红色和蓝色的线(plus plane与minus plane)就是support vector所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙。
当支持向量确定下来的时候,分割函数就确定下来了,两个问题是等价的。得到支持向量,还有一个作用是,让支持向量后方那些点就不用参与计算了。
给出我们要优化求解的表达式:
min ||w||^2,这个式子可以让函数更平滑,之所以说更加平滑了,我认为是因为平方的作用使得w表示的特征更加明显从而更易区分,所以SVM是一种不太容易over-fitting的方法。
原问题,加上一些限制条件:
后面的s.t. 限制条件有多个,对应着样本的个数。
3、拉格朗日乘子法
在求解上式最优解前,先来看看拉格朗日乘子法。
探讨不等式约束的极值问题求法,问题如下:
定义1:一般化的拉格朗日公式:
这里的α和β都是拉格朗日乘子,要求上式的最小值,先看看定义2.
定义2:
p代表primal原始的。
假设gi(w)>0或者hi(w)≠0,因此可以通过调整α和β来使得Θp(w)有最大值为无穷;而只有当满足约束gi(w)≤0 and hi(w)=0时,Θp(w)可以f(w)。如下图:
因此,我们要求的min_w f(w) 可以转换为 min_w Θp(w) 。
要求解min_w Θp(w),首先是有2个参数w和α,其次先求关于α的最大值,考虑到α也是不等式约束,然后再在w上求最小值,难度比较大。那先看看定义3。
定义3:
D代表dual对偶,ΘD(w)将问题从原先的先求关于α的最大值再求关于w的最小值,转变为先求关于w的最小值再求关于α的最大值,
这个问题是原问题的对偶问题,相对于原问题只是更换了min和max的顺序,而且一般更换顺序的结果是
上式的相关证明,请参考: 对该关系解释的很详细很清楚。
下面解释下两者在什么情况下是等价的,也就是满足KKT(Karush-Kuhn-Tucker, KKT condition)条件。
4、KKT
该条件如下:
所以,如果w, α, β满足上述的几个条件,那么他们就是原问题和对偶问题的解。
其中,公式(5)这个条件可以理解为如果α>0,那么gi(w)=0,也就是说w处于可行域(gi(w)≤0)的边界上,也就是所说的支持向量;如果α=0,那么gi(w)<0,也就是位于可行域的内部,也就不是所说的支持向量。
5、目标函数的变换
讲了这么多定义,回到SVM目标函数求最优解的问题上来。
原问题:
利用拉格朗日乘子法,转换为拉格朗日函数:
下面按照对偶问题的求解步骤进行:
对上式,没有β原因是没有等式约束条件,首先求解L(w, b, α)最小值,只和w、b有关系,因此对w和b分别求偏导,得到:
第一个式子变换下得到:
将其代回到拉格朗日函数,并将其化简:
最后得到:
由于最后一项为0,简化为:
拉格朗日函数现在只包含α变量,而我们求出了α也就得到了w和b。
接着,是极大化过程:
对于这个问题的求解,需要借助SMO(序列最小优化算法)等算法。
本文参考的博客:
理解SVM的三层境界:
帮助挺大的,讲的易懂
拉格朗日乘子和KKT条件: