本章摘要:
这一节主要是理解支持向量机一些理论知识。由于理论性质较强,我们需要借助其他的一些文章知识帮助我们理解SVM。大部分理论是摘录一些经典文章来总结,大家都可以进行参考。
基于最大间隔分割数据
优点:泛化错误率低,计算开销不大
缺点:参数调节和核函数的选择敏感,原始分类器不修改只能处理二类分类器
适用的数据类型:数值型和标称型数据。
分隔超平面
我们先看以下4个图:
能够将上面的数据集分隔开来的直线就是分隔超平面。当数据点在二维平面的时候,分隔超平面就是一个平面。显而易见,更高维的情况同样适用,比如数据集是1024那么就需要一个1023维对象对数据分隔。这个对象被称为超平面,也就是分类的决策边界。
我们希望采用这种方式来构建分类器,如果数据点离决策边界越远,那么结果就约可信。但是我们的目标并不是简单寻找距离最佳直线或者平面,而是可以观测距离分隔面最近的点,使得他们距离尽可能大。
支持向量:离分隔超平面最近的那些点
最优超平面
给定一个特定的超平面,我们可以计算出这个超平面与和它最接近的数据点之间的距离。间隔(Margin)就是二倍的这个距离。
一般来说,间隔(Margin)中间是无点区域。这意味着里面不会有任何点。(注:在数据有噪声的情况下,可能达不到这么理想的状况,所以我们后面会引入软间隔分类器)同时我们还能得到以下结论。如果一个超平面有非常接近的数据点,那么间隔会小,如果超平面离数据点越远那么间隔越大。最优分隔超平面就有最优的间隔。SVM是利用间隔最大化求得最优分离超平面
这一节下面内容摘录:http://blog.csdn.net/han_xiaoyang/article/details/52683653
我们都知道一条直线的数学方程是: y=ax+b ,而超平面会被定义成类似的形式:
只要找到一个分隔超平面,就能计算平行于这个超平面的间隔。得到间隔之后,就能通过它的中点找到另外一个超平面(比如上图的中间蓝色直线)。所以
- 寻找最大间隔,就是寻找最优超平面
- 读取你的数据集。
- 找到两个平行超平面,可以划分数据并且两平面之间没有数据点。
- 最大化上述两个超平面间隔
给出一个超平面
H0
划分数据集并且满足:
我们选择其他两个划分数据集的超平面的
H1
和
H2
,有如下的方程:
设定 δ 与 −δ 的原因是为了让 H0 与 H1 和 H2 等距。
不过再仔细想想,你会发现 w 和 b 是可以缩放的,这里的变量 δ 其实是没有必要的,为了简化(不引入那么多未知数),我们通过一定的缩放,让 δ=1 来简化问题。OK,所以我们有了一下形式的2个超平面:
还有一个事情咱们得确认一下:它们之间没有任何的数据点。
我们只选择那些符合以下两个约束的超平面:
对于每一个向量
xi
满足
咱们来试着理解一下上面的约束,在下面的图中,所有的红点都是 1 类,所有的蓝点都是 −1 类。
可以通过这个约束条件使得 选择两个 中间没有数据点 的超平面。当然,这里举得例子是二维平面的,而实际上对于更高维的空间也是成立的。
两边同乘 yi (在该约束中始终为-1)
这意味着方程式
(5)
可以写做:
在方程
(4)
中,因为y_i =1,它不改变不等号方向。
将方程式 (6) 和 (7) 写在一起 :
OK,我们得到了一个很简洁的约束条件(方程8),它和方程4,5在数学上是等价的,也能保证两超平面间没有数据点。
下面就是如何保证间隔最大化
- H0 是满足约束 w⋅x−b=−1 的超平面
- H1 是满足约束 w⋅x−b=1 的超平面
- x0 是 H0 上的一点
对了,从 x0 到超平面 H1 的垂直距离m就是我们所说的间隔。 x0 在超平面 H0 上,所以m是超平面 H0 与 H1 间的距离。
然后通过下面这个图
我们其实是想要找到这样一个向量:
我们发行已经有一个垂直 H1 的向量,是 w W. 我们定义 u=w∥w∥ 是 w 的单位向量,即 ∥u∥=1 ,且它和 w 有相同的方向,垂直于平面 H1 。
- 长度为m
- 方向垂直于平面 H1
如果我们用 u 乘以 m ,得到向量 k=mu ,让k满足:
就是通过这样一个方式把m转换成一个可以和向量 x0 相加的向量 k . 如果我们在向量 x0 上加上 k ,可以得到向量 z0=x0+k (终点在超平面 H1 上),如下图所示
- ∥k∥=m
- k 垂直于 H1 ,因为它与 u 具有相同方向
下面是推导的精华所在:
z0
在
H1
上意味着
我们可以用 x0+k 代替 z0
用方程式
(9)
替代
k
将式子展开可得
向量与自己的内积是它的模的平方,所以:
因为
x0
在
H0
上,所以
w⋅x0+b=−1
,带入:
我们找到了一种计算 m 的方法
最大化间隔也就是最小化 w 的模。
我们的目标是最大化间隔。在所有满足约束条件超平面中,我们选择有最小 ∥w∥ 的超平面,因为这意味着有最大间隔。
有了以下的优化问题:
解决这个问题有点像求解方程。一旦解出来答案,我们会找到满足约束条件,也使得 ∥w∥ 最小的值对 (w,b) 。对,你可以把它叫做最优超平面的方程!
转化成优化问题
这是个凸二次规划问题。什么叫凸?凸集是指有这么一个点的集合,其中任取两个点连一条直线,这条线上的点仍然在这个集合内部,因此说“凸”是很形象的。例如下图,对于凸函数(在数学表示上,满足约束条件是仿射函数,也就是线性的Ax+b的形式)来说,局部最优就是全局最优,但对非凸函数来说就不是了。二次表示目标函数是自变量的二次函数。
虽然这个问题确实是一个标准的 QP 问题,但是它也有它的特殊结构,通过 Lagrange Duality 变换到对偶变量 (dual variable) 的优化问题之后,可以找到一种更加有效的方法来进行求解,而且通常情况下这种方法比直接使用通用的 QP 优化包进行优化要高效得多。也就说,除了用解决QP问题的常规方法之外,还可以应用拉格朗日对偶性,通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一是对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。
SVM对偶问题转换
虽然这个问题确实是一个标准的 QP 问题,但是它也有它的特殊结构,通过 Lagrange Duality 变换到对偶变量 (dual variable) 的优化问题之后,可以找到一种更加有效的方法来进行求解,而且通常情况下这种方法比直接使用通用的 QP 优化包进行优化要高效得多。也就说,除了用解决QP问题的常规方法之外,还可以应用拉格朗日对偶性,通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一是对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。
对于SVM,前面提到,其primal problem是以下形式:
同样的方法引入拉格朗日乘子,我们就可以得到以下拉格朗日函数:
对L(w, b, α)分别求w和b的极值。也就是L(w, b,α)对w和b的梯度为0:∂L/∂w=0和∂L/∂b=0,还需要满足α>=0。求解这里导数为0的式子可以得到:
再代入拉格朗日函数后,就变成:
这个就是dual problem(如果我们知道α,我们就知道了w。反过来,如果我们知道w,也可以知道α)。这时候我们就变成了求对α的极大,即是关于对偶变量α的优化问题(没有了变量w,b,只有α)。当求解得到最优的α*后,就可以同样代入到上面的公式,导出w*和b*了,最终得出分离超平面和分类决策函数。
也就是训练好了SVM。那来一个新的样本x后,就可以这样分类了:
以上内容摘录:http://blog.csdn.net/zouxy09/article/details/17291543
KKT条件
KKT条件是拉格朗日乘子法的泛化,如果我们把等式约束和不等式约束一并纳入进来则表现为:
L(x,λ,μ)=f(x)+∑ni=1λihi(x)+∑qk=1μkgk(x)λi≠0hi(x)=0μk≥0gk(x)≤0⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪ L(x,λ,μ)=f(x)+∑i=1nλihi(x)+∑k=1qμkgk(x)λi≠0hi(x)=0μk≥0gk(x)≤0}=> ⎧⎩⎨⎪⎪⎪⎪minxmaxμL(x,λ,μ)=maxμminxL(x,λ,μ)=minxf(x)=f(x∗)μkgk(x∗)=0∂L(x,λ,μ)∂x|x=x∗=0 {minxmaxμL(x,λ,μ)=maxμminxL(x,λ,μ)=minxf(x)=f(x∗)μkgk(x∗)=0∂L(x,λ,μ)∂x|x=x∗=0
注: x,λ,μ x,λ,μ都是向量。
∂L(x,λ,μ)∂x|x=x∗=0 ∂L(x,λ,μ)∂x|x=x∗=0表明 f(x) f(x)在极值点 x∗ x∗处的梯度是各个 hi(x∗) hi(x∗)和 gk(x∗) gk(x∗)梯度的线性组合。
其实很多的 αi 都是0,也就是说 w 只是一些少量样本的线性加权值。这种“稀疏”的表示实际上看成是KNN的数据压缩的版本。也就是说,以后新来的要分类的样本首先根据 w 和b做一次线性运算,然后看求的结果是大于0还是小于0来判断正例还是负例。现在有了 αi ,我们不需要求出 w ,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的 αi 不为0,其他情况 αi 都是0。因此,我们只需求新来的样本和支持向量的内积,然后运算即可
松弛向量与软间隔
具体来说,原来的约束条件就变为:
这时候,我们在目标函数里面增加一个惩罚项,新的模型就变成(也称软间隔):
经过同样的推导过程,我们的对偶优化问题变成:
之前模型唯一不同在于 αi 又多了 αi <=C的限制条件
我们的最优解需要满足KKT条件:
同时βi*和ξi*都需要大于等于0,而αi*需要在0和C之间。那可以分三种情况讨论:
总的来说就是, KKT条件就变成了:
第一个式子表明如果αi=0,那么该样本落在两条间隔线外。第二个式子表明如果αi=C,那么该样本有可能落在两条间隔线内部,也有可能落在两条间隔线上面,主要看对应的松弛变量的取值是等于0还是大于0,第三个式子表明如果0<αi<C,那么该样本一定落在分隔线上(这点很重要,b就是拿这些落在分隔线上的点来求的,因为在分割线上wTx+b=1或者-1嘛,才是等式,在其他地方,都是不等式,求解不了b)。
核函数
如上图右,如果我们可以把我们的原始样本点通过一个变换,变换到另一个特征空间,在这个特征空间上是线性可分的,那么上面的SVM就可以轻易工作了。也就是说,对于不可分的数据,现在我们要做两个工作:
1)首先使用一个非线性映射Φ(x)将全部原始数据x变换到另一个特征空间,在这个空间中,样本变得线性可分了;
2)然后在特征空间中使用SVM进行学习分类。
我们可以回头看看上面SVM的优化问题:
可以看到,对样本x的利用,只是计算第i和第j两个样本的内积就可以了。
也是计算两个样本的内积。也就是说,训练SVM和使用SVM都用到了样本间的内积,而且只用到内积。那如果我们可以找到一种方法来计算两个样本映射到高维空间后的内积的值就可以了。核函数就是完成这伟大的使命的:
K(xi, xj)=Φ(xi)T Φ(xj)
也就是两个样本xi和xj对应的高维空间的内积Φ(xi)T Φ(xj)通过一个核函数K(xi, xj)计算得到。而不用知道这个变换Φ(x)是何许人也。
而且这个核函数计算很简单,常用的一般是径向基RBF函数:
这时候,我们的优化的对偶问题就变成了:
和之前的优化问题唯一的不同只是样本的内积需要用核函数替代而已。优化过程没有任何差别。而决策函数变成了:
不同的理解: