
本文共 11282 字,大约阅读时间需要 37 分钟。
一般地,对于二分类问题,当训练数据集线性可分时,存在无穷多个分离超平面可将两类数据正确分开。感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个,线性可分支持向量机利用间隔最大化求最优分离超平面,这时,解释唯一的。
1、函数间隔和几何间隔
(1)几何间隔:
中学时学过,平面中对于直线Ax+By+C=0和点(x,y),点到直线距离的公式为:
D=|Ax+By+C|√A2+B2
当我们把维数变成思维甚至高维的时候,对于给定的超平面(w,b)及其法向量w和高维空间中的一点xi,xi在数据集中的标记为yi,当样本点(xi,yi)被超平面正确分类时,点xi和超平面(w,b)的距离是:
γi=yi∗w⋅xi+b||w||
其中yi∈{ +1,−1},w,b∈Rn,||w||是w的L2范数。
因此,这里的γi被定义为超平面(w,b)关于样本点(xi,yi)的几何间隔。
定义超平面(w,b)关于训练数据集T的几何间隔为超平面(w,b)关于T中所有样本点(xi,yi)的几何间隔之最小值,即:
γ=mini=1,2,...,Nγi
(2)函数间隔:
对于给定的训练数据集T和超平面(w,b),定义超平面(w,b)关于样本点(xi,yi)的函数间隔为:
ˆγi=yi(w⋅xi+b)
定义超平面(w,b)关于训练数据集T的函数间隔为超平面(w,b)关于T中所有样本点(xi,yi)的函数间隔之最小值,即:
ˆγ=mini=1,2,...,Nˆγi
函数间隔ˆγ和几何间隔γ的关系:
γi=ˆγi||w||γ=ˆγ||w||
2、间隔最大化
(1)最大间隔分类超平面
间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据及进行分类,也就是说,不仅要将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。最大间隔分离超平面可以表示为下面的约束最优化问题:
maxw,bγs.t. yi∗w⋅xi+b||w||≥γ,i=1,2,3,...N
考虑几何间隔和函数间隔的关系,可以将这个问题改写为:
maxw,bˆγ||w||s.t. yi∗(w⋅xi+b)≥ˆγ,i=1,2,3,...N
函数间隔\hat\gamma的取值并不影响最优化问题的解,事实上,假设将w和b按比例变为\lambda w和\lambda b,这时的函数间隔变为\lambda\hat\gamma,函数间隔这一改变对最优化问题的不等式约束没有影响,对目标函数的优化也没有影响,也就是说,它产生了一个等价的优化问题。这样就可以取\hat\gamma=1代入上面的最优化问题,注意到最大化\frac{1}{||w||}\quad和最小化\frac12\quad ||w||是等价的,就可以得到线性可分支持向量机学习的最优化问题:
\min_{w,b}\,\,\,\,\frac12\quad||w||^2 \\ s.t.\,\,\,\,\,y_i*(w\cdot x_i+b)-1 \geq 0,i=1,2,3,...N
这时一个凸二次规划问题。
(2)支持向量和间隔边界
在线性可分的情况下,训练数据集的样本点与分离超平面距离最近的样本点的实例称为支持向量,支持向量是使下式成立的点,即:
y_i(w\cdot x_i)+b-1=0
对于y_i=+1的正实例点,支持向量在超平面:
H_1:w\cdot x+b=1
对于y_i=-1的正实例点,支持向量在超平面:
H_2:w\cdot x+b=-1
H1和H2平行,并且没有实例点落在他们中间,在H1和H2之间形成一条长带,分离超平面与它们平行且位于它们中央,长带的宽度,即H1和H2之间的距离称为间隔,间隔依赖于分离超平面的法向量w,等于\frac 2 {||w||} \quad,H1和H2称为间隔边界。在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用,由于支持向量在确定分离超平面中起着决定性作用,所以这种分类模型称为支持向量机。
(3)硬间隔最大化的对偶问题
上述问题的求解可以看做原始问题,应用拉格朗日对偶性,同过求解对偶问题得到原始问题的最优解,这就是线性可分支持向量机的对偶算法,这样做的优点,一是对偶问题往往更容易求解,二是自然引入核函数,进而推广到非线性问题。
首先构建拉格朗日函数,为此为上述优化问题的每一个不等式约束引入拉格朗日乘子\alpha_1\ge0,i=1,2,...,N,定义拉格朗日函数:
L(w,b,\alpha)=\frac12\quad||w||^2-\sum_{i=1}^N\alpha_iy_i(w\cdot x_i+b)+\sum_{i=1}^N\alpha_i
其中,\alpha=(\alpha_1,\alpha_2,..,\alpha_N)为拉格朗日乘子向量。
根据朗格朗日对偶性,原始问题的对偶问题是极大极小问题:
\max_\alpha \min_{w,b}L(w,b,\alpha)
所以,为了得得到对偶问题的解,需要先求L(w,b,\alpha)对w,b的极小,再求对\alpha的极大。
1)求\min_{w,b}L(w,b,\alpha)
将拉格朗日函数L(w,b,\alpha)分别对w,b求偏导并令其等于0得到:
w=\sum_{i=1}^N\alpha_iy_ix_i\,\,\,\,\,\sum_{i=1}^N\alpha_iy_i=0
将上述结果代入拉格朗日函数即得:
L(w,b,\alpha)=-1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i\cdot x_j)+\sum_{i=1}^N\alpha_i
即
\min_{w,b}L(w,b,\alpha)=-1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i\cdot x_j)+\sum_{i=1}^N\alpha_i
2)求\min_{w,b}L(w,b,\alpha)对\alpha的极大,即是对偶问题:
\max_\alpha\,\,\,\, -1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i\cdot x_j)+\sum_{i=1}^N\alpha_i \\ s.t. \,\,\,\,\sum_{i=1}^N\alpha_iy_i=0, \,\,\,\alpha_i\ge0,i=1,2,...,N
将上式目标函数由极大转换为求极小,就得到以下等价的对偶问题:
\min_\alpha\,\,\,\, 1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i\cdot x_j)-\sum_{i=1}^N\alpha_i \\ s.t. \,\,\,\,\sum_{i=1}^N\alpha_iy_i=0, \,\,\,\alpha_i\ge0,i=1,2,...,N
定理:设\alpha^*=(\alpha^*_1,\alpha^*_2,...,\alpha^*_l)^T是对偶问题的解,则存在下标j使得\alpha^*_j\gt0,并可按下式求得原始最优化问题的解:
w^*=\sum_{i=1}^N\alpha_i^*y_ix_i \,\,\,\,\,\,b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot x_j)
(4)软间隔最大化
线性可分问题的支持向量机学习算法,对线性不可分训练数据是不适用的,因为这时上述方法中的不等式约束并不能都成立,怎么样扩展到线性不可分问题呢?这就需要修改硬间隔最大化,使其变成软间隔最大化。
给定一个特征空间上的训练数据集
T=\{(x_1,y_1).(x_2,y_2),...(x_N,y_N)\}
其中x_i\in R^n,y_i\in\{-1,1\},i=1,2,...,N。假设训练数据集是线性不可分的,通常情况下,训练数据集中有一些特异点,将这些特异点出去后,剩下的大部分样本点组成的集合是线性可分的。
线性不可分意味着这些样本点(x_i,y_i),不能满足函数间隔大于1的约束条件,为了解决这个问题,可以对每个样本点(x_i,y_i)引进一个松弛变量\xi _i\ge0,使函数间隔加上松弛变量大于等于1,这样约束条件变为:
y_i*(w\cdot x_i+b)\geq 1-\xi_i
同时对每个松弛变量\xi_i支付一个代价\xi_i,此时的目标函数变成:
\frac12\quad||w||^2+C\sum_{i=1}^N\xi_i
这里,C>0为惩罚参数,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小。最小化目标函数包含两层含义:使\frac12\quad||w||^2尽量小即间隔尽量大,同时使\sum_{i=1}^N\xi_i尽量小即误分类点的个数尽量少,C是调和二者的系数。因此线性不可分的线性支持向量机的学习问题变成如下凸二次规划:
\min_{w,b,\xi}\,\,\,\,\frac12\quad||w||^2+C\sum_{i=1}^N\xi_i \\ s.t.\,\,\,\,\,y_i*(w\cdot x_i+b)\geq 1-\xi_i,i=1,2,3,...N \\ \xi_i\ge0,i=1,2,3,...,N
原始问题是一个凸二次规划问题,因而关于(w,b,\xi)的解是存在的,可以证明w的解是唯一的,但是b的解可能不是唯一的,而是存在一个区间。
(5)软间隔最大化的对偶问题
类似于硬间隔最大化时求对偶问题,软间隔最大化时的对偶问题同理可得:
\min_\alpha\,\,\,\, 1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j(x_i\cdot x_j)-\sum_{i=1}^N\alpha_i \\ s.t. \,\,\,\,\sum_{i=1}^N\alpha_iy_i=0, \,\,\,0\le\alpha_i\le C,i=1,2,...,N
定理:设\alpha^*=(\alpha^*_1,\alpha^*_2,...,\alpha^*_l)^T是对偶问题的解,则存在下标j使得0\lt \alpha^*_j\lt C,并可按下式求得原始最优化问题的解:
w^*=\sum_{i=1}^N\alpha_i^*y_ix_i \,\,\,\,\,\,b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot x_j)
3、核技巧
对于线性分类问题,线性分类支持向量机是一种非常有效的方法,但是,有时分类问题是非线性的,这时可以使用非线性支持向量机,非线性支持向量机的主要特点是核技巧。
(1)什么是核技巧
先看一个例子:下图是一个分类问题,图中”\cdot”表示正实例点,“X”表示负实例点,由图可见,无法用直线将正负实例点分开,但可以用一条椭圆曲线将它们正确分开。一般来说,对于一个二分类问题,如果能用R^n中一个超曲面将正负实例分开,则称这个问题为非线性可分问题。
非线性问题不好求解,解决方法是进行一个非线性变换,把非线性问题变换为线性问题,通过求解变换后的线性问题的方法求解原来的非线性问题。对上图的例子,通过变换,将左图的椭圆变换为右图中的直线,将非线性问题转换为线性分类问题。设原空间x=(x^{(1)},x^{(2)})\in R^2,新空间x=(z^{(1)},z^{(2)}) \in R^2,定义从原空间到新空间的变换:
z=\phi (x)=((x^{(1)})^2,(x^{(2)})^2)^T
经过变换z=\phi (x),原空间的点变成新空间的点,原空间的椭圆:
w_1(x^{(1)})^2+w_2(x^{(2)})^2)+b=0
变成新空间中的直线:
w_1z^{(1)}+w_2z^{(2)}+b=0
在变换后的新空间里,直线w_1z^{(1)}+w_2z^{(2)}+b=0可以将变换后的正负实例点正确分开,这样,原空间的非线性问题变成了新空间的线性可分问题。
上面的例子说明,用线性分类方法求解非线性分类问题分成两步:首先使用一个变换将原空间的数据映射到新空间,然后在新空间用线性分类学习方法从训练集中学习分类模型,核技巧就是属于这种方法。核技巧用到支持向量机,其基本思想就是通过一个非线性变换将输入空间(欧式空间R^n)对应于一个特征空间(希尔伯特空间H),使得输入空间中的超曲面模型对应于希尔伯特空间中的超平面模型。
(2)核函数
设R^n为输入空间,又设H为希尔伯特空间,如果存在一个从R^n到H的映射:
\phi(x):R^n->H
使得对所有的x,z\in R^n,函数K(x,z)满足条件:
K(x,z)=\phi(x) \cdot \phi(z)
则称K(x,z)为核函数,\phi(x)为映射函数,\phi(x) \cdot \phi(z)是\phi(x)和\phi(z)的内积。
核技巧的想法是,在学习与预测中只定义核函数K(x,z),而不是显式定义映射函数。通常,直接计算核函数比较容易,而通过映射函数计算核函数并不容易。对于给定的核函数K(x,z),特征空间H和映射函数\phi的取法并不唯一。
例如:核函数为K(x,z)=(x\cdot z)^2,可以取:
H=R^3\,\,\,\,\,\,\phi(x)=((x^{(1)})^2,\sqrt2x^{(1)}x^{(2)},(x^{(2)})^2)^T
H=R^4\,\,\,\,\,\,\phi(x)=((x^{(1)})^2,x^{(1)}x^{(2)},x^{(1)}x^{(2)},(x^{(2)})^2)^T
(3)核技巧在支持向量的应用
在线性支持向量机的对偶问题中,无论是目标函数还是决策函数(分离超平面)都只涉及到输入实例与实例间的内积。在对偶问题的目标函数中,x_i\cdot x_j可以用核函数K(x_i,x_j)=\phi(x_i)\phi(x_j)来替代,因此对偶问题的目标函数称为:
W(\alpha)=1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_i
同样,分类决策函数中的内积也可以用核函数代替,而分类决策函数式成为:
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_i\phi(x_i)\cdot \phi(x)+b^*)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_iK(x_i,x)+b^*)
也就是说,在核函数的条件下,可以利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行的,不需要显示定义特征空间和映射函数,这样的技巧成为核技。在实际应用中,往往依赖领域知识直接选择核函数,核函数选择的有效性需要通过实验验证。
(4)常用核函数
通常所说的核函数都是正定核函数,不用构造映射\phi(x)能否直接判断一个给定的函数K(x,z)是不是核函数?或者说,函数K(x,z)满足什么条件才能成为核函数?
正定核的充要条件:
设K:R^n\cdot R^n->R是对称函数,则K(x,z)为正定核函数的充要条件是对任意x_i\in R^n,i=1,2,...,m,K(x,z)对应的Gram矩阵:
K=[K(x_i,x_j)]_{m\times m}
是半正定矩阵。
正定核的等价定义:
设K(x,z)是定义在R^n\cdot R^n->R上的对称函数,对任意x_i\in R^n,i=1,2,...,m,K(x,z)对应的Gram矩阵:
K=[K(x_i,x_j)]_{m\times m}
是半正定矩阵,则称K(x,z)是正定核。
在实际问题中,验证一个具体函数是否为核函数并不容易,因此往往应用已有的核函数,下面介绍常用的核函数。
1)多项式核函数:
K(x,z)=(x\cdot z+1)^p
对应的支持向量机是一个p次多项式分类器,此时的分类决策函数为:
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_i(x_i\cdot x+1)^p+b^*)
2)高斯核函数:
K(x,z)=\exp(-\frac{||x-z||^2}{2\sigma^2}\quad)
其中,\sigma为标准差。对应的支持向量机是高斯径向基函数分类器,此时分类决策函数为:
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_i\exp(-\frac{||x_i-x||^2}{2\sigma^2}\quad)+b^*)
3)内积的正整数幂函数:
K(x,z)=(x\cdot z)^p
其中p是正整数。分类决策函数为:
f(x)=sign(\sum_{i=1}^{N_s}\alpha_i^*y_i(x_i\cdot x)^p+b^*)
4、SVM的实现问题
如何高效的实现SVM成为一个重要问题,目前人们已经提出了许多快速实现算法,接下来将讲述序列最小最优化算法SMO,该算法在1998年提出。SMO算法要解决如下凸二次规划的对偶问题:
\min_\alpha\,\,\,\, 1/2\,\,\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_i \\ s.t. \,\,\,\,\sum_{i=1}^N\alpha_iy_i=0, \,\,\,0\le\alpha_i\le C,i=1,2,...,N
在这个问题中,变量是拉格朗日乘子,一个变量\alpha_i对应于一个样本点(x_i,y_i),变量的总数等于训练样本容量N。
SMO算法是一种启发式算法,其基本思想是:如果所有变量都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,如果不是所有变量都满足KKT条件,选择两个变量,固定其它变量,针对这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。更重要的是,这时子问题可以通过解析方法求解,这样可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反KKT条件最严重的那一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
整个SMO算法包括两个部分:求解两个变量二次规划的解析方法和选择变量的启发式算法。
输入:训练数据集T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},其中x_i \in R^n,y_i \in \{-1,1\},i=1,2,3,...,N,精度\varepsilon
输出:近似解:\hat \alpha
(1)取初值\alpha^{(0)}=0,k=0
(2)选取优化变量\alpha^{(k)}_1,\alpha^{(k)}_2,解析求解两个变量的最优化问题,求得最优解\alpha^{(k+1)}_1,\alpha^{(k+1)}_2,跟新\alpha为\alpha^{(k+1)}
(3)若在精度\varepsilon 范围内满足停机条件(KKT条件)则转(4),否则k=k+1,转(2)
(4)取\hat \alpha=\alpha^{(k+1)}
5、SVM实现多分类的方法
(1)一对多法(one-versus-rest,简称OVR SVMs)
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。假如我有四类要划分(也就是4个Label),他们是A、B、C、D。于是我在抽取训练集的时候,分别抽取
1)A所对应的向量作为正集,B,C,D所对应的向量作为负集;
2)B所对应的向量作为正集,A,C,D所对应的向量作为负集;
3)C所对应的向量作为正集,A,B,D所对应的向量作为负集;
4)D所对应的向量作为正集,A,B,C所对应的向量作为负集;
使用这四个训练集分别进行训练,然后的得到四个训练结果文件。在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。于是最终的结果便是这四个值中最大的一个作为分类结果。
评价:这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased.因而不是很实用。可以在抽取数据集的时候,从完整的负集中再抽取三分之一作为训练负集。
(2)一对一法(one-versus-one,简称OVO SVMs或者pairwise)
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。投票是这样的:
A=B=C=D=0;
(A,B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;
(A,C)-classifier 如果是A win,则A=A+1;otherwise, C=C+1;
…
(C,D)-classifier 如果是A win,则C=C+1;otherwise,D=D+1;
The decision is the Max(A,B,C,D)
评价:这种方法虽然好,但是当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。
(3)DAG方法(有向无环图)
DAG-SvMS是由PIatt提出的决策导向的循环图DAG导出的,是针对“一对一”SvMS存在误分,拒分现象提出的。这种方法的训练过程类似于“一对一”方法,k类别问题需要求解k(k-1)/2个支持向量机分类器,这些分类器构成一个有向无环图。该有向无环图中含有k(k-1)/2个内部节点和k个叶节点,每个节点对应一个二类分类器。
DAG-SVMS简单易行,只需要使用k-1个决策函数即可得出结果,较“一对一”方法提高了测试速度,而且不存在误分、拒分区域;另外,由于其特殊的结构,故有一定的容错性,分类精度较一般的二叉树方法搞。然而,由于存在自上而下的“误差累积”现象是层次结构固有弊端,故DAG-SVMS也逃脱不掉。即如果在某个节点上发生了分类错误,则会把分类错误延续到该结点的后续结点上。
6、SVM的代码实现(使用sklearn)
from sklearn import svmif __name__=='__main__': X = [[0, 0], [1, 1]] # 特征 y = [0, 1] # 标签 clf = svm.SVC() # 调用svm分类器 print clf.fit(X, y) # 训练 print clf.predict([[2., 2.]]) #预测'''参数详解:SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) 1)C:浮点数 默认为1.0 错误项的惩罚参数C 2)cache_size:浮点型,可选。指定内核缓存的大小(以MB为单位)。 3)Class_weight:{‘dict’,’balanced’ }, 可选。 将类i的参数C设置为SVC的class_weight[I]*C。如果没有给出,所有类的weight 为1.‘balanced’模式使用y 值自动调整权重,调整方式是与输入数据中类频率成反比。如n_samples / (n_classes * np.bincount(y)) 4)Coef0: 浮点型,默认为0.0. 核函数的独立特征,仅仅在’poly’和‘sigmoid’核函数中有意义 5)decision—function—shape:‘ovo’,’ovr’或者默认 none。是否将一对多’ovr’的决策函数其形式为(n_samples, n_classes),返回为其他的分类器。或者返回原始的一对一’ovo’决策函数其形式为,(n_samples, n_classes * (n_classes - 1) / 2)。默认值“None”目前表现为“ovo”,用于向后兼容,并引发弃用警告,但会将更改为“ovr”在0.19版本。 6)degree:整数形,默认为3。用于多项式核函数的度数('poly')。 被所有其他内核忽略。 7)gamma:浮点,可选默认为’auto’。该参数是'rbf','poly'和'sigmoid'的内核系数。 如果gamma是'auto',那么将会使用1 / n_features。 8)kernel:核函数,默认为rbf(径向基函数)型,其他可选的有linear,poly,sigmoid,precomputed,以及可调用自定义形式callable。如果给出了一个可调用函数,则用于从数据矩阵预先计算核心矩阵; 该矩阵应该是一个数组其形式为(n_samples,n_samples)。 9)max_iter: 最大迭代次数,default = 1,选默认-1。求解器中迭代的极限,或无限制的-1。 10)probability:布尔型,可选,默认为False。是否启用概率估计,必须在调用fit之前启用,启用后会降低算法效率 11)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。 12)shrinking:布尔型,可选默认为True。是否使用缩减启发式。 13)Tol : 浮点型,默认为3.0。停止标准的公差 14)verbose: 布尔型,默认为False。启用详细输出。 请注意,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程环境中正常工作。'''