上篇博客我们讲的是logistic分类器,一个基于概率的分类器,本篇的SVM(support vector machine)是一个基于间隔的二元分类器。
支持向量机
在机器学习中,支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络[1])是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。
线性支持向量机
根据支持向量机的数据是否线性可分,支持向量机又分为线性可分支持向量机和非线性可分支持向量机。
给定数据样本集
xi∈R,yi∈γ={+1,−1},i=1,2,3,..N x i ∈ R , y i ∈ γ = { + 1 , − 1 } , i = 1 , 2 , 3 , . . N , xi x i 是第 i i 个特征向量,是 xi x i 的类别。yi取1或者-1表示两个不同的类别。所以一个线性分类器的作用就是在特征空间中找到一个超平面,将实例分到两个不同的类。超平面的方程表示为
超平面将数据样本分为两类,一部分指向正类,一部分指向负类。
如图所示的,红色表示正例,蓝色表示负例。训练数据集线性可分,这时候有很多直线能够将两类数据正确划分。而线性可分支持向量机则对应着将两类直线划分并且间隔最大的直线。如下图所示,找出一个最粗直线使之刚好能够将两个类别正确划分,并且这条最粗的直线是唯一的(唯一性的证明可以参考统计学习方法)。
从几何上面直观的表示,由于超平面是用来划分两类数据的,因此距离超平面越远,越容易划分。而距离超平面越近的点,则越不容易划分。因为超平面稍微转动一下的话就会导致数据从一个类别划分到了另一个类别。因此我们需要找到那个最粗的线。这里就需要引入函数间隔和集合间隔。
函数间隔和几何间隔
一般而言,一个点距离超平面的远近可以表示分类预测预测的确信程度。在超平面 wx+b=0 w x + b = 0 确定的情况下, |wx+b| | w x + b | 能够表示点 x x 距离超平面的远近,而的符号和类标记 y y 的符号是否一致可以表示分类是否正确。所以可以用来表示分类的正确性和可信度,这就是函数间隔(functional margin)的概念。
定义(函数间隔) 对于给定的训练数据集T和超平面(w,b),定义超平面(w,b)与样本点 (xi,yi) ( x i , y i ) 的函数间隔为
定义超平面(w,b)关于训练数据集T的函数间隔为超平面(w,b)关于T所有样本点 (xi,yi) ( x i , y i ) ( i=1,2,3,4...N} i=1,2,3,4...N} )函数间隔的最小值,即
函数间隔可以表示分类预测的正确性和确定度,但是选择分离超平面的时候只有函数间隔还是不够的,因为只要成比例的改变w和b,超平面没有变,函数间隔却变成了原来的两倍,这一事实其实我们,可以对超平面的法向量·w加上约束例如规划化||w||=1,是间隔确定,此时函数间隔变成了几何间隔(geometric margin)。
计算与超平面的距离
给定超平面(w,b)及其法向量w,点A表示某一实例
xi
x
i
,,其类标记
yi=+1
y
i
=
+
1
。点A与超平面(w,b)的距离由线段AB给出,记作
ζi
ζ
i
其中
||w||
|
|
w
|
|
是w的L2范数。这是点A在超平面的正的一侧。如果点A在超平面负的一侧,即
yi=−1
y
i
=
−
1
,那么点与超平面的距离为
即表示的是蓝线或者粉红色线到中间红线的距离= ζ ζ
下面引出几何间隔
几何间隔定义 对于给定的训练集T和超平面(w,b),定义超平面(w,b)关于点
(xi,yi)
(
x
i
,
y
i
)
的几何间隔为:
其实就是距离乘以 yi y i
定义超平面(w,b)关于训练集T的几何间隔为超平面(w,b)关于T中所有样本点 (xi,yi) ( x i , y i ) 的几何间隔的最小值,即
几何间隔一般指的是实例点到超平面带符号的距离,当样本分类正确的时候就是实例点到超平面的距离。
所以有函数间隔和几何间隔的关系为:
如果||w||=1,那么几何间隔和函数间隔相等。如果超平面参数w和b成比例的改变,函数间隔也会成比例的改变,但是几何间隔不变。
间隔最大化
在知道了几何间隔和函数间隔之后,接下来,我们就要确定最大的几何间隔了,即最粗的那条‘分割线’。对于线性可分的训练集而言,几何间隔最大的超平面是唯一的。这里的间隔最大化又称为硬间隔最大化(指的是数据集线性可分的情况,相对于数据集非线性可分的软间隔最大化)。
间隔最大化超平面
间隔最大化超平面就是指的在所有可行的划分线当中找出间隔最大的一条。这个问题可以表示为下面的约束问题
考虑到几何间隔和函数间隔的关系,可以将这个问题改为:
由于函数间隔的改变对于上面的不等式约束没有什么影响,也就是说他可以产生一个等价的最优化问题,这样就可以去 γ^ γ ^ ,我们令 γ^=1, γ ^ = 1 , 所以上面的问题等价于
其实最大化 1||w|| 1 | | w | | 和最小化 12||w||2 1 2 | | w | | 2 是等价的,所以我们就得到了下面的最优化问题。为了方便求解,我们还加上了一个平方和系数。
于是就变成了一个凸二次规划问题(关于凸优化这里博主其实不太了解,有大佬懂的的可以交流下),可以直接用优化计算包,但是我们可以用更高效的方法利用拉格朗日乘子法。
对偶问题
利用拉格朗日的对偶性,我们可以通过求解对偶问题来求解原始问题的最优解,这是线性可分支持向量机的对偶算法。这样做的优点有两个,一是对偶问题往往更容易求解,二是自然引入核函数,进而推广到非线性分类问题。
具体来讲就是对上面的公式添加拉格朗日算子约束,于是我们要求的问题变成了
然后我们令
容易验证,当某些约束条件不满足的时候,例如
yi(wx+b)<1
y
i
(
w
x
+
b
)
<
1
的时候
θ=∞
θ
=
∞
(只要令
ai=∞
a
i
=
∞
).当所有的约束条件都满足的时候,则有
θ(w)=12||w||2
θ
(
w
)
=
1
2
|
|
w
|
|
2
,因此在满足约束条件的情况下,最小化
12||w||2
1
2
|
|
w
|
|
2
等价于直接最小化
θ(w)
θ
(
w
)
,所以我们的目标函数变成了
根据拉格朗日的对偶性,我们可以将原始问题变成,在满足KKT条件下两者是等价的
所以我们现在开始对这个问题进行求解:
(1)求
minL(w,b,a)
m
i
n
L
(
w
,
b
,
a
)
将拉格朗日函数L(w,b,a)分别对w,b求偏导并令其等于0
函数L(w,b,a)对w偏导
解得:
同理对b求偏导:
解得:
然后将式(2)(3)带入式(1)中
此时我们得到关于 dual variable α 的优化问题:
KKT条件
所以上述优化满足KKT条件
现在我们来对对偶问题进行求解
f(x)=wTx+b
f
(
x
)
=
w
T
x
+
b
,前面我们推导出
w=∑Ni=1aixiyi
w
=
∑
i
=
1
N
a
i
x
i
y
i
因此将w带入到
f(x)
f
(
x
)
当中
因此对于新点的预测,只需要计算其与训练集里面的点的內积就行了。从KKT条件中我们知道,对于support vector, α≥0 α ≥ 0 ,而对于非support vector, α=0 α = 0 。 算到这一步之后,通过方程组的计算,就可以把w和b求出来。即求出了所要的支持向量机(参考统计学习方法上面例子)。
前面我们所讲的都是值硬间隔最大化,下面介绍软间隔最大化
软间隔最大化
硬间隔和软间隔的区别在于训练集是否线性可分。如果完全线性可分,则说明是硬间隔。而通常情况下训练集线性不可分是由于一些特异点(outlier)的存在,将这些特异点出去之后,剩下的大部分样本所组成的集合还是线性可分的。由于超平面是由几个support vector组成,因此outlier其实对我们的SVM模型影响非常大。如下面图所示,由于异常的蓝色点使得超平面偏差很大。
为了解决这种问题,我们允许数据点在一定程度上偏离超平面。黑色线所对应的就是偏离之后的距离,如果将其移动回来,就落在原来的超平面上,而不会是超平面发生形变。具体做法:引进一个松弛变量
ξi≥0
ξ
i
≥
0
,势函数间隔加上松弛变量大于等于1,这样约束条件为
同时对于每一个松弛变量 ξi ξ i ,支付一个代价 ξi ξ i .目标函数由原来的 12||w||2 1 2 | | w | | 2 变成了
C>0成为惩罚函数,一般由应用问题决定,C值大时对误分类的惩罚增加了,C值小的时候对误分类的惩罚减小.最小化目标函数(4)有两层含义。一是使 12||w||2 1 2 | | w | | 2 尽量小即间隔尽量打,而是是被错误分类的数据点尽量少,C是调和两者的系数。
于是完整的目标函数为
将约束条件带入到目标函数当中则有:
μi表示第二个参数 μ i 表 示 第 二 个 参 数
分别对 w,b,ξ w , b , ξ 求偏导有
求解得:
将其带入到目标函数(5)中得
与上面相比红色约束条件发生了变化,其他都是一样。这样线性或者近似线性的支持向量机就这样介绍完毕。下篇介绍非线性支持向量机以及核函数。
前面我们谈到的是线性可分和近似线性可分的数据,但是我们有时候会遇到无法对其进行线性分类的数据。例如下图中的圆。
对于上面的圆,理想的分界线应该是一个圆,而不是一条直线。如果用 X1 X 1 和 X2 X 2 表示这个二维平面的两个坐标的话,我们知道一条二次曲线的方程可以写成
如果我们构造另外一个五维空间,其中五个坐标分别为 Z1=X1,Z2=X21,Z3=X2,Z4=X22,Z5=X1X2 Z 1 = X 1 , Z 2 = X 1 2 , Z 3 = X 2 , Z 4 = X 2 2 , Z 5 = X 1 X 2 ,那么显然方程在新的坐标下面可以写成
关于新的方程Z,正是一个超平面方程,也就是说,如果我们做一个映射, ϕ:R2→R5 ϕ : R 2 → R 5 ,将 X X 按照上面的规则映射成,那么原来不能线性可分的数据在新的空间里面就变得线性可分,从而我们可以使用前面提到的处理线性可分数据的方法。这就是kernel的思想。
再进一步描述 Kernel 的细节之前,不妨再来看看这个例子映射过后的直观例子。当然,我没有办法把 5 维空间画出来,不过由于我这里生成数据的时候就是用了特殊的情形,具体来说,我这里的超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆):
因此我只需要把它映射到 Z1=X21, Z2=X22, Z3=X2 这样一个三维空间中即可,下图(这是一个 gif 动画)即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的:
所以对于核函数的定义
核函数 设
χ
χ
是输入空间(欧式空间
Rn
R
n
的子集或者离散子集),又设
H
H
为特征空间(希尔伯特空间),如果存在一个从到
H
H
的映射
使得对所有的 x,z∈χ x , z ∈ χ ,函数 K(x,z) K ( x , z ) 满足条件:
则称 K(x,z) K ( x , z ) 为核函数, ϕ(x) ϕ ( x ) 为映射函数,式中 ϕ(x)ϕ(z) ϕ ( x ) ϕ ( z ) 为 ϕ(x) ϕ ( x ) 和 ϕ(z) ϕ ( z ) 的內积。
前面我们最终得到的分类函数是
在映射之后的空间则变成
其中 α α 也是求解下面的对偶问题得到的
参考资料
- 李航《统计学习方法》
- 周志华《机器学习》
- 《机器学习实战》
- pluskid的SVM系列博客
- 林轩田:机器学习技法
- SVM核函数