(六)统计学习方法 | 支持向量机


1. 支持向量机

1.1 简介与定义

支持向量机 S V M {\rm SVM} SVM是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,而间隔最大使它有别于感知机算法;支持向量机还支持核函数,这使它称为实质上的非线性分类器。支持向量机由简到繁包括:线性可分支持向量机线性支持向量机非线性支持向量机。这里,通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机

1.2 线性可分支持向量机

假设给定一个特征空间上的训练数据集: T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}

其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N x i x_i xi为第 i i i个特征向量,也称为实例, y i y_i yi x i x_i xi的类标记。当 y i = + 1 y_i=+1 yi=+1时,称 x i x_i xi为正例;当 y i = − 1 y_i=-1 yi=1时,称 x i x_i xi为负例。 ( x i , y i ) (x_i,y_i) (xi,yi)称为样本点,且假设训练数据集是线性可分的。学习的目标是在特征空间中找到一个分离超平面,能将实例分到不同的类。分离超平面对应于方程 w ⋅ x + b = 0 w\cdot x+b=0 wx+b=0,它由法向量 w w w截距 b b b决定。一般来说,当训练数据集线性可分时,存在无数个分离超平面可将两类数据正确分开。感知机利用误分类最小的策略,求得分离超平面,不过这时的解有无穷多个;线性可分支持向量机利用间隔最大化求最优分离超平面,这时的解是唯一的。

线性可分支持向量机 给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为: w ∗ ⋅ x + b ∗ = 0 (1) w^*\cdot x+b^*=0\tag{1} wx+b=0(1)

以及相应的分类决策函数: f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) (2) f(x)={\rm sign}(w^*\cdot x+b^*)\tag{2} f(x)=sign(wx+b)(2)

称为线性可分支持向量机。

1.3 函数间隔和几何间隔

在这里插入图片描述
在上图中,有 A , B , C A,B,C A,B,C三个点,表示 3 3 3个实例,均在分离超平面的正类一侧,预测它们的类。点 A A A距分离超平面较远,若预测该点为正类,就比较确信预测是正确的;点 C C C距分类超平面较近,若预测该点为正类就不那么确信;点 B B B介于点 A A A和点 C C C之间,预测其为正类的确信度也在 A A A C C C之间。一般来说,一个点距离分类超平面的远近可以表示分类预测的确信程度。在超平面 w ⋅ x + b = 0 w\cdot x+b=0 wx+b=0确定的情况下, ∣ w ⋅ x + b ∣ |w\cdot x+b| wx+b能够相对地表示点 x x x距离超平面的远近。而 w ⋅ x + b w\cdot x+b wx+b得符号与类标记 y y y得符号是否一致能够表示分类是否正确。所以,可以使用 y ( w ⋅ x + b ) y(w\cdot x+b) y(wx+b)来表示分类得正确性以及确信度,即函数间隔。

函数间隔 对于给定的训练数据集 T T T和超平面 ( w , b ) (w,b) (w,b),定义超平面 ( w , b ) (w,b) (w,b)关于样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的函数间隔为: γ ^ i = y i ( w ⋅ x i + b ) {\hat\gamma}_i=y_i(w\cdot x_i+b) γ^i=yi(wxi+b)

定义超平面 ( w , b ) (w,b) (w,b)关于训练数据集 T T T的函数间隔为超平面 ( w , b ) (w,b) (w,b)关于 T T T中所有样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的函数间隔之最小值
γ ^ = min ⁡ i = 1 , . . . , N γ ^ i \hat\gamma=\min_{i=1,...,N}\hat\gamma_i γ^=i=1,...,Nminγ^i

函数间隔可以表示分类预测的正确性及确信度。但是选择分类超平面时,只有函数间隔还不够。因为只要成比例地改变 w w w b b b,超平面并没有改变,而函数间隔却在改变。在这里插入图片描述

上图给出了超平面 ( w , b ) (w,b) (w,b)以及法向量 w w w。点 A A A表示某一实例 x i x_i xi,其类标记为 y i = + 1 y_i=+1 yi=+1。点 A A A与超平面 ( w , b ) (w,b) (w,b)的距离由线段 A B AB AB给出,记作 γ i \gamma_i γi γ i = w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ \gamma_i=\frac{w}{||w||}\cdot x_i+\frac{b}{||w||} γi=wwxi+wb

其中 ∣ ∣ w ∣ ∣ ||w|| w w w w的第二范数。这时点 A A A在超平面正的一侧的情形。如果点 A A A在超平面负的一侧,即 y i = − 1 y_i=-1 yi=1,那么点与超平面的距离为: γ i = − ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) \gamma_i=-\left(\frac{w}{||w||}\cdot x_i+\frac{b}{||w||}\right) γi=(wwxi+wb)

一般地,当样本点 ( x i , y i ) (x_i,y_i) (xi,yi)被超平面 ( w , b ) (w,b) (w,b)正确分类时,点 x i x_i xi与超平面 ( w , b ) (w,b) (w,b)的距离是: γ i = y i ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) \gamma_i=y_i\left(\frac{w}{||w||}\cdot x_i+\frac{b}{||w||}\right) γi=yi(wwxi+wb)

几何间隔 对于给定的训练数据集 T T T和超平面 ( w , b ) (w,b) (w,b),定义超平面 ( w , b ) (w,b) (w,b)关于样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的几何间隔为: γ i = y i ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) (3) \gamma_i=y_i\left(\frac{w}{||w||}\cdot x_i+\frac{b}{||w||}\right)\tag{3} γi=yi(wwxi+wb)(3)

定义超平面 ( w , b ) (w,b) (w,b)关于训练数据集 T T T的几何间隔为超平面 ( w , b ) (w,b) (w,b)关于 T T T中所有样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的几何间隔之最小值:
γ = min ⁡ i = 1 , . . . , N γ i \gamma=\min_{i=1,...,N}\gamma_i γ=i=1,...,Nminγi

从函数间隔和几何间隔的定义可知,它们之间有以下关系: γ i = γ ^ i ∣ ∣ w ∣ ∣ \gamma_i=\frac{\hat\gamma_i}{||w||} γi=wγ^i

γ = γ ^ ∣ ∣ w ∣ ∣ \gamma=\frac{\hat\gamma}{||w||} γ=wγ^

如果 ∣ ∣ w ∣ ∣ = 1 ||w||=1 w=1,那么函数间隔和几何间隔相等。如果超平面参数 w w w b b b成比例地改变,函数间隔也按此比例改变,而几何间隔不变。

1.4 间隔最大化

1.4.1 最大间隔分离超平面

下面考虑如何求得一个几何间隔最大的超平面,即最大间隔分离超平面。具体地,这个问题可以表示为下面的约束最优化问题: max ⁡ w , b   γ \max_{w,b}\ \gamma w,bmax γ

s . t .   y i ( w ∣ ∣ w ∣ ∣ ⋅ x i + b ∣ ∣ w ∣ ∣ ) ≥ γ ,   i = 1 , 2 , . . . , N (4) s.t.\ y_i\left(\frac{w}{||w||}\cdot x_i+\frac{b}{||w||}\right)\geq\gamma,\ i=1,2,...,N\tag{4} s.t. yi(wwxi+wb)γ, i=1,2,...,N(4)

即我们希望最大化超平面 ( w , b ) (w,b) (w,b)关于训练数据集的几何间隔 γ \gamma γ,约束条件表示的是超平面 ( w , b ) (w,b) (w,b)关于每个训练样本点的几何间隔至少是 γ \gamma γ。考虑几何间隔和函数间隔的关系,上面式子可以写作: max ⁡ w , b   γ ^ ∣ ∣ w ∣ ∣ \max_{w,b}\ \frac{\hat\gamma}{||w||} w,bmax wγ^

s . t .   y i ( w ⋅ x i + b ) ≥ γ ^ ,   i = 1 , 2 , . . . , N (5) s.t.\ y_i(w\cdot x_i+b)\geq\hat\gamma,\ i=1,2,...,N\tag{5} s.t. yi(wxi+b)γ^, i=1,2,...,N(5)

函数间隔 γ ^ \hat\gamma γ^的取值并不影响最优化问题的解。事实上,假设将 w w w b b b按比例地改变为 λ w \lambda w λw λ b \lambda b λb,这时的函数间隔变为 λ γ ^ \lambda\hat\gamma λγ^。函数间隔的这一改变对上面最优化问题的不等式约束没有影响,也就是说,它产生了一个等价的最优化问题。这样,就可以取 γ ^ = 1 \hat\gamma=1 γ^=1,将其代入上面的最优化问题,就得到下面的线性可分支持向量机学习的最优化问题: min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 \min_{w,b}\frac{1}{2}||w||^2 w,bmin21w2

s . t .   y i ( w ⋅ x i + b ) − 1 ≥ 0 ,   i = 1 , 2 , . . . , N (6) s.t.\ y_i(w\cdot x_i+b)-1\geq0,\ i=1,2,...,N\tag{6} s.t. yi(wxi+b)10, i=1,2,...,N(6)

这时一个凸二次规划问题。如果求出了约束最优化问题的解 w ∗ w^* w b ∗ b^* b,那么就可以得到最大间隔分离超平面 w ∗ ⋅ x + b ∗ = 0 w^*\cdot x+b^*=0 wx+b=0及分类决策函数 f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) f(x)={\rm sign}(w^*\cdot x+b^*) f(x)=sign(wx+b),即线性可分支持向量机。

线性可分支持向量机——最大间隔法

输入 线性可分训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N

输出 最大间隔分离超平面和分类决策函数。

(1)构造并求解约束最优化问题: min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 \min_{w,b}\frac{1}{2}||w||^2 w,bmin21w2

s . t .   y i ( w ⋅ x i + b ) − 1 ≥ 0 ,   i = 1 , 2 , . . . , N s.t.\ y_i(w\cdot x_i+b)-1\geq0,\ i=1,2,...,N s.t. yi(wxi+b)10, i=1,2,...,N

求得最优解 w ∗ w^* w b ∗ b^* b

(2)由此得到分离超平面: w ∗ ⋅ x + b ∗ = 0 w^*\cdot x+b^*=0 wx+b=0

分类决策函数:
f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) . f(x)={\rm sign}(w^*\cdot x+b^*). f(x)=sign(wx+b).

1.4.2 最大间隔分离超平面的存在唯一性

若训练数据集 T T T线性可分,则可将训练数据集中的样本点完全正确分开的最大间隔分离超平面存在且唯一

1.4.3 支持向量和间隔边界

在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量。支持向量是使式(6)中约束条件等号成立的点,即: y i ( w ⋅ x i + b ) = 0 y_i(w\cdot x_i+b)=0 yi(wxi+b)=0

对于 y i = + 1 y_i=+1 yi=+1的正例点,支持向量在超平面: H 1 : w ⋅ x + b = 1 H_1: w\cdot x+b=1 H1:wx+b=1

对于 y i = − 1 y_i=-1 yi=1的负实例点,支持向量在超平面 H 2 : w ⋅ x + b = − 1 H_2: w\cdot x+b=-1 H2:wx+b=1

如图,在 H 1 H_1 H1 H 2 H_2 H2上的点就是支持向量:在这里插入图片描述
上图中 H 1 H_1 H1 H 2 H_2 H2平行,并且没有实例点落在它们中间。在 H 1 H_1 H1 H 2 H_2 H2之间形成一条长带,分离超平面与它们平行且位于它们中央。长带的宽度,即 H 1 H_1 H1 H 2 H_2 H2之间的距离称为间隔。间隔大小依赖于分离超平面的法向量 w w w,等于 2 / ∣ ∣ w ∣ ∣ 2/||w|| 2/w H 1 H_1 H1 H 2 H_2 H2称为间隔边界

在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。如果移动支持向量将改变所求的解;但是如果在间隔边界以外移动其他实例点,甚至去掉这些点,则解是不会改变的。由于支持向量在确定分离超平面中起着决定性作用,所以将这种分类模型称为支持向量机。支持向量的个数一般很少,所以支持向量机由很少的重要的训练样本确定

例题 如下图所示的训练数据集,其正例点是 x 1 = ( 3 , 3 ) T x_1=(3,3)^{\rm T} x1=(3,3)T x 2 = ( 4 , 3 ) T x_2=(4,3)^{\rm T} x2=(4,3)T,负实例点是 x 3 = ( 1 , 1 ) T x_3=(1,1)^{\rm T} x3=(1,1)T,求最大间隔分离超平面。
在这里插入图片描述

首先构造最优化问题: min ⁡ w , b   1 2 ( w 1 2 + w 2 2 ) \min_{w,b}\ \frac{1}{2}(w_1^2+w_2^2) w,bmin 21(w12+w22)

s . t .   1 ⋅ ( 3 w 1 + 3 w 2 + b ) − 1 ≥ 0 s.t.\ 1\cdot(3w_1+3w_2+b)-1\geq 0 s.t. 1(3w1+3w2+b)10

1 ⋅ ( 4 w 1 + 3 w 2 + b ) − 1 ≥ 0 1\cdot(4w_1+3w_2+b)-1\geq 0 1(4w1+3w2+b)10

− 1 ⋅ ( w 1 + w 2 + b ) − 1 ≥ 0 -1\cdot(w_1+w_2+b)-1\geq 0 1(w1+w2+b)10

构造拉格朗日函数: L ( w , b , λ ) = 1 2 ( w 1 2 + w 2 2 ) + λ 1 ( 3 w 1 + 3 w 2 + b − 1 ) + λ 2 ( 4 w 1 + 3 w 2 + b − 1 ) − λ 3 ( w 1 + w 2 + b + 1 ) \begin{aligned} L(w,b,\lambda)&=\frac{1}{2}(w_1^2+w_2^2)+\lambda_1(3w_1+3w_2+b-1)+\lambda_2(4w_1+3w_2+b-1)\\&-\lambda_3(w_1+w_2+b+1) \end{aligned} L(w,b,λ)=21(w12+w22)+λ1(3w1+3w2+b1)+λ2(4w1+3w2+b1)λ3(w1+w2+b+1)

求偏导数: { ∂ L ( w , b , λ ) ∂ w 1 = w 1 + 3 λ 1 + 4 λ 2 − λ 3 ∂ L ( w , b , λ ) ∂ w 2 = w 2 + 3 λ 1 + 3 λ 2 − λ 3 ∂ L ( w , b , λ ) ∂ b = λ 1 + λ 2 − λ 3 ∂ L ( w , b , λ ) ∂ λ 1 = 3 w 1 + 3 w 2 + b − 1 ∂ L ( w , b , λ ) ∂ λ 2 = 4 w 1 + 3 w 2 + b − 1 ∂ L ( w , b , λ ) ∂ λ 3 = w 1 + w 2 + b + 1 \left\{ \begin{aligned} & \frac{\partial L(w,b,\lambda)}{\partial w_1}=w_1+3\lambda_1+4\lambda_2-\lambda_3 \\ & \frac{\partial L(w,b,\lambda)}{\partial w_2}=w_2+3\lambda_1+3\lambda_2-\lambda_3 \\ & \frac{\partial L(w,b,\lambda)}{\partial b}=\lambda_1+\lambda_2-\lambda_3 \\ & \frac{\partial L(w,b,\lambda)}{\partial \lambda_1}=3w_1+3w_2+b-1 \\ & \frac{\partial L(w,b,\lambda)}{\partial \lambda_2}=4w_1+3w_2+b-1 \\ & \frac{\partial L(w,b,\lambda)}{\partial \lambda_3}=w_1+w_2+b+1 \end{aligned} \right. w1L(w,b,λ)=w1+3λ1+4λ2λ3w2L(w,b,λ)=w2+3λ1+3λ2λ3bL(w,b,λ)=λ1+λ2λ3λ1L(w,b,λ)=3w1+3w2+b1λ2L(w,b,λ)=4w1+3w2+b1λ3L(w,b,λ)=w1+w2+b+1

然后令各偏导数的值为 0 0 0。最后可求得结果如下:
w 1 = w 2 = 1 2 ,   b = − 2 ,   λ 1 = λ 3 = − 1 4 ,   λ 2 = 0 w_1=w_2=\frac{1}{2},\ b=-2,\ \lambda_1=\lambda_3=-\frac{1}{4},\ \lambda_2=0 w1=w2=21, b=2, λ1=λ3=41, λ2=0

于是,最大间隔分离超平面为: 1 2 x ( 1 ) + 1 2 x ( 2 ) − 2 = 0 \frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2=0 21x(1)+21x(2)2=0

其中, x 1 = ( 3 , 3 ) T x_1=(3,3)^{\rm T} x1=(3,3)T x 3 = ( 1 , 1 ) T x_3=(1,1)^{\rm T} x3=(1,1)T是支持向量。

1.4.4 学习的对偶算法

为了求解线性可分支持向量机的最优化问题,将它作为原始最优化问题,应用拉格朗日对偶性,通过求解对偶问题得到问题的解。这样做的优点是:(1)对偶问题往往更容易求解;(2)引入核函数,进而推广到非线性分类。

首先构建拉格朗日函数。为此,对每一个不等式约束条件引入拉格朗日乘子 α i ≥ 0 \alpha_i\geq0 αi0 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,定义拉格朗日函数(最后一项的加入不改变原最优化问题): L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i y i ( w ⋅ x + b ) + ∑ i = 1 N α i (7) L(w,b,\alpha)=\frac{1}{2}||w||^2-\sum_{i=1}^N\alpha_iy_i(w\cdot x+b)+\sum_{i=1}^N\alpha_i\tag{7} L(w,b,α)=21w2i=1Nαiyi(wx+b)+i=1Nαi(7)

根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题: max ⁡ α min ⁡ w , b L ( w , b , α ) \max_{\alpha}\min_{w,b}L(w,b,\alpha) αmaxw,bminL(w,b,α)

(1)求 min ⁡ w , b L ( w , b , α ) \min \limits_{w,b}L(w,b,\alpha) w,bminL(w,b,α),求偏导数并令为 0 0 0
∇ w L ( w , b , α ) = w − ∑ i = 1 N α i y i x i = 0 \nabla_wL(w,b,\alpha)=w-\sum_{i=1}^N\alpha_iy_ix_i=0 wL(w,b,α)=wi=1Nαiyixi=0

∇ b L ( w , b , α ) = − ∑ i = 1 N α i y i = 0 \nabla_bL(w,b,\alpha)=-\sum_{i=1}^N\alpha_iy_i=0 bL(w,b,α)=i=1Nαiyi=0

得到: w = ∑ i = 1 N α i y i x i (8) w=\sum_{i=1}^N\alpha_iy_ix_i\tag{8} w=i=1Nαiyixi(8)

∑ i = 1 N α i y i = 0 (9) \sum_{i=1}^N\alpha_iy_i=0\tag{9} i=1Nαiyi=0(9)

将式(8)带入式(7),并利用式(9),得到: L ( w , b , α ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i y i ( ( ∑ j = 1 N α j y j x j ) ⋅ x i + b ) + ∑ i = 1 N α i = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i \begin{aligned} L(w,b,\alpha)&=\frac{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_iy_i\left(\left(\sum_{j=1}^N\alpha_jy_jx_j\right)\cdot x_i+b\right)+\sum_{i=1}^N\alpha_i\\ &=-\frac{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 \end{aligned} L(w,b,α)=21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαiyi((j=1Nαjyjxj)xi+b)+i=1Nαi=21i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi

即: min ⁡ w , b L ( w , b , α ) = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i \min_{w,b}L(w,b,\alpha)=-\frac{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 w,bminL(w,b,α)=21i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi

(2)求 min ⁡ w , b L ( w , b , α ) \min \limits_{w,b}L(w,b,\alpha) w,bminL(w,b,α) α \alpha α的极大,即是对偶问题: max ⁡ α   − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i (10) \max_{\alpha}\ -\frac{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\tag{10} αmax 21i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi(10)

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

α i ≥ 0 ,   i = 1 , 2 , . . . , N \alpha_i\geq0,\ i=1,2,...,N αi0, i=1,2,...,N

将式(10)由极大转换为极小: min ⁡ α   1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i (11) \min_{\alpha}\ \frac{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\tag{11} αmin 21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi(11)

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

α i ≥ 0 ,   i = 1 , 2 , . . . , N \alpha_i\geq0,\ i=1,2,...,N αi0, i=1,2,...,N

由定理,存在 w ∗ , α ∗ , β ∗ w^*,\alpha^*,\beta^* w,α,β,使 w ∗ w^* w是原优化问题(7)的解, α ∗ , β ∗ \alpha^*,\beta^* α,β是对偶优化问题式(11)的解。对于线性可分训数据集,假设 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T α \alpha α的解。然后可以由求得的 α ∗ \alpha^* α求出原优化问题(7)的解 w ∗ , b ∗ w^*,b^* w,b

定理 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T式对偶最优化问题的解,则存在下标 j j j,使得 α j ∗ > 0 \alpha_j^*>0 αj>0,并可按下式求得原始最优化问题的解 w ∗ , b ∗ w^*,b^* w,b w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w=i=1Nαiyixi

b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ y j ) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot y_j) b=yji=1Nαiyi(xiyj)

线性可分支持向量机学习算法

输入 线性可分训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N

输出 分离超平面和分类决策函数。

(1)构造并求解约束最优化问题: min ⁡ α   1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i \min_{\alpha}\ \frac{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 21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi

求得最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T

(2)计算: w ∗ = ∑ i = 1 N α i ∗ y i x i (12) w^*=\sum_{i=1}^N\alpha_i^*y_ix_i\tag{12} w=i=1Nαiyixi(12)

并选择 α ∗ \alpha^* α的一个正分量 α j ∗ > 0 \alpha_j^*>0 αj>0,计算: b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ x j ) (13) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot x_j)\tag{13} b=yji=1Nαiyi(xixj)(13)

(3)求得分离超平面: w ∗ ⋅ x + b ∗ = 0 w^*\cdot x+b^*=0 wx+b=0

分类决策函数: f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) f(x)={\rm sign}(w^*\cdot x+b^*) f(x)=sign(wx+b)

由上一定理可知, w ∗ w^* w b ∗ b^* b只依赖于数据中 α i ∗ > 0 \alpha_i^*>0 αi>0的样本点 ( x i , y i ) (x_i,y_i) (xi,yi),而其他样本点对 w ∗ w^* w b ∗ b^* b没有影响。我们将训练数据集中对应于 α i ∗ > 0 \alpha_i^*>0 αi>0的实例点 x i ∈ R n x_i\in\bold R^n xiRn称为支持向量

解例题

给定所给数据,对偶问题是: min ⁡ α   1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i = 1 2 ( 18 α 1 2 + 25 α 2 2 + 2 α 3 2 + 42 α 1 α 2 − 12 α 1 α 3 − 14 α 2 α 3 ) − α 1 − α 2 − α 3 \begin{aligned} \min_{\alpha}\ &\frac{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 \\ &=\frac{1}{2}(18\alpha_1^2+25\alpha_2^2+2\alpha_3^2+42\alpha_1\alpha_2-12\alpha_1\alpha_3-14\alpha_2\alpha_3)-\alpha_1-\alpha_2-\alpha_3 \end{aligned} αmin 21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi=21(18α12+25α22+2α32+42α1α212α1α314α2α3)α1α2α3

s . t .   α 1 + α 2 − α 3 = 0 s.t.\ \alpha_1+\alpha_2-\alpha_3=0 s.t. α1+α2α3=0

α i ≥ 0 ,   i = 1 , 2 , 3 \alpha_i\geq0,\ i=1,2,3 αi0, i=1,2,3

将约束条件 α 3 = α 1 + α 2 \alpha_3=\alpha_1+\alpha_2 α3=α1+α2带入目标函数,并记为: s ( α 1 , α 2 ) = 4 α 1 2 + 13 2 α 2 2 + 10 α 1 α 2 − 2 α 1 − 2 α 2 s(\alpha_1,\alpha_2)=4\alpha_1^2+\frac{13}{2}\alpha_2^2+10\alpha_1\alpha_2-2\alpha_1-2\alpha_2 s(α1,α2)=4α12+213α22+10α1α22α12α2

用上述函数对 α 1 \alpha_1 α1 α 2 \alpha_2 α2求偏导,并令其为 0 0 0,得到 s s s在点 ( 3 / 2 , − 1 ) T (3/2,-1)^{\rm T} (3/2,1)T处取极值。但是由于该点不满足约束条件 α 2 ≥ 0 \alpha_2\geq0 α20,所以上述函数的最小值应该在边界上取得。当 α 1 = 0 \alpha_1=0 α1=0时,函数的最小值为 − 2 / 13 -2/13 2/13;当 α 2 = 0 \alpha_2=0 α2=0时,函数的最小值为 − 1 / 4 -1/4 1/4。于是 s ( α 1 , α 2 ) s(\alpha_1,\alpha_2) s(α1,α2) α 1 = 1 / 4 , α 2 = 0 \alpha_1=1/4,\alpha_2=0 α1=1/4,α2=0处达到最小。这样, α 1 ∗ = α 3 ∗ = 1 / 4 \alpha_1^*=\alpha_3^*=1/4 α1=α3=1/4对应的实例点 x 1 , x 3 x_1,x_3 x1,x3是支持向量。由式(12)和式(13),解得: w 1 ∗ = w 3 ∗ = 1 2 w_1^*=w_3^*=\frac{1}{2} w1=w3=21

b ∗ = − 2 b^*=-2 b=2

分离超平面为: 1 2 x ( 1 ) + 1 2 x ( 2 ) − 2 = 0 \frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2=0 21x(1)+21x(2)2=0

分类决策函数为: f ( x ) = s i g n ( 1 2 x ( 1 ) + 1 2 x ( 2 ) − 2 ) f(x)={\rm sign}\left(\frac{1}{2}x^{(1)}+\frac{1}{2}x^{(2)}-2\right) f(x)=sign(21x(1)+21x(2)2)

1.5 线性支持向量机与软间隔最大化

1.5.1 线性支持向量机

线性可分间隔支持向量机学习方法对线性不可分训练数据集是不适用的,因为这时上述方法中的不等式约束并不都能成立。将线性可分支持向量机扩展到线性不可分的关键是修改硬间隔最大化,使其称为软间隔最大化。假设给定一个特征空间上的训练数据集: T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}

其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N。再假设训练数据集不是线性可分的,通常的情况是,训练数据中有一些特异点,去除这些特异点后,数据集才变为线性可分。而线性不可分意味着某些样本点 ( x i , y i ) (x_i,y_i) (xi,yi)不满足函数间隔大于等于 1 1 1的约束条件。为了解决这个问题,可以对每个样本点 ( x i , y i ) (x_i,y_i) (xi,yi)引进一个松弛变量 ξ i ≥ 0 \xi_i\geq0 ξi0,使函数间隔加上这个松弛变量后大于等于 1 1 1,即约束条件变为: y i ( w ⋅ x i + b ) ≥ 1 − ξ i y_i(w\cdot x_i+b)\geq1-\xi_i yi(wxi+b)1ξi

同时,对每个松弛变量添加一个代价,目标函数变为: 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i \frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i 21w2+Ci=1Nξi

这里, C > 0 C>0 C>0称为惩罚参数, C C C值越大对误分类的惩罚增大, C C C越小对误分类的惩罚越小。所以,这里得到线性不可分的线性支持向量机的学习问题: min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i \min_{w,b,\xi}\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i w,b,ξmin21w2+Ci=1Nξi

s . t .   y i ( w ⋅ x i + b ) ≥ 1 − ξ i ,    ξ i ≥ 0 ,   i = 1 , 2 , . . . , N s.t.\ y_i(w\cdot x_i+b)\geq1-\xi_i,\ \ \xi_i\geq0,\ i=1,2,...,N s.t. yi(wxi+b)1ξi,  ξi0, i=1,2,...,N

上述原始问题是一个凸二次规划问题,因而关于 ( w , b , ξ ) (w,b,\xi) (w,b,ξ)的解是存在的,可以证明 w w w的解是唯一的,但 b b b的解可能不唯一。

线性支持向量机 对于给定的线性不可分的训练数据集,通过求解凸二次规划问题,即软间隔最大化问题,得到分离超平面: w ∗ ⋅ x + b ∗ = 0 w^*\cdot x+b^*=0 wx+b=0

分类决策函数:
f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) . f(x)={\rm sign}(w^*\cdot x+b^*). f(x)=sign(wx+b).

称为线性支持向量机。

1.5.2 学习的对偶算法

根据线性可分支持向量机学习的对偶算法,相应地得到线性不可分支持向量机的对偶问题: min ⁡ α   1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i (14) \min_{\alpha}\ \frac{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\tag{14} αmin 21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi(14)

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

0 ≤ α i ≤ C ,   i = 1 , 2 , . . . , N 0\leq\alpha_i\leq C,\ i=1,2,...,N 0αiC, i=1,2,...,N

对应的拉格朗日函数: L ( w , b , ξ , α , μ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i − ∑ i = 1 N α i ( y i ( w ⋅ x + b ) − 1 + ξ i ) − ∑ i = 1 N μ i ξ i (15) L(w,b,\xi,\alpha,\mu)=\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i-\sum_{i=1}^N\alpha_i(y_i(w\cdot x+b)-1+\xi_i)-\sum_{i=1}^N\mu_i\xi_i\tag{15} L(w,b,ξ,α,μ)=21w2+Ci=1Nξii=1Nαi(yi(wx+b)1+ξi)i=1Nμiξi(15)

其中, α i ≥ 0 \alpha_i\geq0 αi0 μ i ≥ 0 \mu_i\geq0 μi0

对偶问题是拉格朗日函数的极大极小问题,首先求 L ( w , b , ξ , α , μ ) L(w,b,\xi,\alpha,\mu) L(w,b,ξ,α,μ) w , b , ξ w,b,\xi w,b,ξ的极小,得: w = ∑ i = 1 N α i y i x i w=\sum_{i=1}^N\alpha_iy_ix_i w=i=1Nαiyixi

∑ i = 1 N α i y i = 0 \sum_{i=1}^N\alpha_iy_i=0 i=1Nαiyi=0

C − α i − μ i = 0 C-\alpha_i-\mu_i=0 Cαiμi=0

将上面三式带入式(15)中,得:
min ⁡ w , b , ξ   L ( w , b , ξ , α , μ ) = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i \min_{w,b,\xi}\ L(w,b,\xi,\alpha,\mu)=-\frac{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 w,b,ξmin L(w,b,ξ,α,μ)=21i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi

再对 min ⁡ w , b , ξ   L ( w , b , ξ , α , μ ) \min \limits_{w,b,\xi}\ L(w,b,\xi,\alpha,\mu) w,b,ξmin L(w,b,ξ,α,μ) α \alpha α得极大,即得对偶问题:
max ⁡ α   − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i \max_{\alpha}\ -\frac{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 αmax 21i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi

∑ i = 1 N α i y i = 0 \sum_{i=1}^N\alpha_iy_i=0 i=1Nαiyi=0

C − α i − μ i = 0 C-\alpha_i-\mu_i=0 Cαiμi=0

α i ≥ 0 \alpha_i\geq0 αi0

μ i ≥ 0 ,   i = 1 , 2 , . . . , N \mu_i\geq0,\ i=1,2,...,N μi0, i=1,2,...,N

定理 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T式对偶最优化问题的解,若存在 α ∗ \alpha^* α的一个分量 α j ∗ ≥ 0 \alpha_j^*\geq0 αj0 0 < α j ∗ < C 0<\alpha_j^*<C 0<αj<C,则可按下式求得原始最优化问题的解 w ∗ , b ∗ w^*,b^* w,b w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w=i=1Nαiyixi

b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ y j ) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot y_j) b=yji=1Nαiyi(xiyj)

线性支持向量机学习算法

输入 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N

输出 分离超平面和分类决策函数。

(1)选择惩罚参数 C > 0 C>0 C>0,构造并求解凸二次规划问题: min ⁡ α   1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i \min_{\alpha}\ \frac{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 21i=1Nj=1Nαiαjyiyj(xixj)i=1Nαi

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

0 ≤ α i ≤ C ,   i = 1 , 2 , . . . , N 0\leq\alpha_i\leq C,\ i=1,2,...,N 0αiC, i=1,2,...,N

求得最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T

(2)计算: w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w=i=1Nαiyixi

选择 α ∗ \alpha^* α的一个分量 α j ∗ ≥ 0 \alpha_j^*\geq0 αj0满足条件 0 < α j ∗ < C 0<\alpha_j^*<C 0<αj<C,计算: b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ y j ) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot y_j) b=yji=1Nαiyi(xiyj)

(3)求得分离超平面: w ∗ ⋅ x + b ∗ = 0 w^*\cdot x+b^*=0 wx+b=0

分类决策函数: f ( x ) = s i g n ( w ∗ ⋅ x + b ∗ ) f(x)={\rm sign}(w^*\cdot x+b^*) f(x)=sign(wx+b)

1.5.3 支持向量

在线性不可分的情况下,将对偶问题的解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T中对应于 α i ∗ > 0 \alpha_i^*>0 αi>0的样本点 ( x i , y i ) (x_i,y_i) (xi,yi)称为支持向量。软间隔的支持向量 x i x_i xi或者在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分一侧。若 α i ∗ < C \alpha_i^*<C αi<C,则 ξ i = 0 \xi_i=0 ξi=0,支持向量 x i x_i xi恰好落在间隔边界上;若 α i ∗ = C , 0 < ξ i < 1 \alpha_i^*=C,0<\xi_i<1 αi=C,0<ξi<1,则分类正确, x i x_i xi在间隔边界与分离超平面之间;若 α i ∗ = C , ξ i = 1 \alpha_i^*=C,\xi_i=1 αi=C,ξi=1,则 x i x_i xi在分离超平面上;若 α i ∗ = C , ξ i > 1 \alpha_i^*=C,\xi_i>1 αi=C,ξi>1,则 x i x_i xi位于分离超平面误分一侧。

1.5.4 合页损失函数

线性支持向量机学习还有另外一种解释,就是最小化以下目标函数: ∑ i = 1 N [ 1 − y i ( w ⋅ x i + b ) ] + + λ ∣ ∣ w ∣ ∣ 2 \sum_{i=1}^N[1-y_i(w\cdot x_i+b)]_++\lambda||w||^2 i=1N[1yi(wxi+b)]++λw2

目标函数的第一项是经验损失或风险损失,函数: L ( y ( w ⋅ x + b ) ) = [ 1 − y ( w ⋅ x + b ) ] + L(y(w\cdot x+b))=[1-y(w\cdot x+b)]_+ L(y(wx+b))=[1y(wx+b)]+

称为合页损失函数。下标正号表示以下取正值的函数: [ z ] + = { z ,   z > 0 0 ,   z ≤ 0 [z]_+=\left\{ \begin{aligned} & z,\ &z>0 \\ & 0,\ &z\leq0 \end{aligned} \right. [z]+={z, 0, z>0z0

也就是说,当样本点 ( x i , y i ) (x_i,y_i) (xi,yi)被正确分类且函数间隔 y i ( w ⋅ x i + b ) y_i(w\cdot x_i+b) yi(wxi+b)大于 1 1 1时,损失是 0 0 0,否则损失是 1 − y i ( w ⋅ x i + b ) 1-y_i(w\cdot x_i+b) 1yi(wxi+b)

定理 线性支持向量机原始最优化问题: min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i \min_{w,b,\xi}\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i w,b,ξmin21w2+Ci=1Nξi

s . t .   y i ( w ⋅ x i + b ) ≥ 1 − ξ i ,    ξ i ≥ 0 ,   i = 1 , 2 , . . . , N s.t.\ y_i(w\cdot x_i+b)\geq1-\xi_i,\ \ \xi_i\geq0,\ i=1,2,...,N s.t. yi(wxi+b)1ξi,  ξi0, i=1,2,...,N

等价于最优化问题: min ⁡ w , b    ∑ i = 1 N [ 1 − y i ( w ⋅ x i + b ) ] + + λ ∣ ∣ w ∣ ∣ 2 \min_{w,b}\ \ \sum_{i=1}^N[1-y_i(w\cdot x_i+b)]_++\lambda||w||^2 w,bmin  i=1N[1yi(wxi+b)]++λw2

1.6 非线性支持向量机与核函数

对解线性分类问题,线性分类支持向量机是一种非常有效的方法。但是,有时分类问题是非线性的,这时可以使用非线性支持向量机,其主要特点就是利用核技巧

1.6.1 核技巧

一般来说,对给定的一个训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中,实例 x i x_i xi属于输入空间, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn,对应的标记有两类 y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N。如果能用 R n \bold R^n Rn中的一个超曲面将正负实例正确分开,则称这个问题为非线性可分问题。这里,设原空间为 X ⊂ R n , x = ( x ( 1 ) , x ( 2 ) ) T ∈ X \mathcal X\sub\bold R^n,x=(x^{(1)},x^{(2)})^{\rm T}\in\mathcal X XRn,x=(x(1),x(2))TX,新空间为 Z ⊂ R 2 , z = ( z ( 1 ) , z ( 2 ) ) T ∈ Z \mathcal Z\sub\bold R^2,z=(z^{(1)},z^{(2)})^{\rm T}\in\mathcal Z ZR2,z=(z(1),z(2))TZ,定义从原空间到新空间的变换: z = ϕ ( x ) = ( ( x ( 1 ) ) 2 , ( x ( 2 ) ) 2 ) T z=\phi(x)=((x^{(1)})^2,(x^{(2)})^2)^{\rm T} z=ϕ(x)=((x(1))2,(x(2))2)T

经过变换 z = ϕ ( x ) z=\phi(x) z=ϕ(x),原空间 X ⊂ R n \mathcal X\sub\bold R^n XRn变换为新空间 Z ⊂ R n \mathcal Z\sub\bold R^n ZRn,原空间中的点相应地变换为新空间中的点,原空间中的椭圆: w 1 ( x ( 1 ) ) 2 + w 2 ( x ( 2 ) ) 2 + b = 0 w_1(x^{(1)})^2+w_2(x^{(2)})^2+b=0 w1(x(1))2+w2(x(2))2+b=0

变换为新空间中的直线: w 1 z ( 1 ) + w 2 z ( 2 ) + b = 0 w_1z^{(1)}+w_2z^{(2)}+b=0 w1z(1)+w2z(2)+b=0

在变换的空间里,直线 w 1 z ( 1 ) + w 2 z ( 2 ) + b = 0 w_1z^{(1)}+w_2z^{(2)}+b=0 w1z(1)+w2z(2)+b=0可以将变换后的正负实例点正确分开。这样,原空间的非线性可分问题就变成了新空间的线性可分问题。
在这里插入图片描述

用线性分类方法求解非线性分类问题分为两步:首先使用一个变换将原空间的数据映射到新空间;然后在新空间里用线性分类学习方法从训练数据中学习分类模型。核技巧就属于这样的方法。

核函数 X \mathcal X X是输入空间,又设 H \mathcal H H为特征空间,如果存在一个从 X \mathcal X X H \mathcal H H的映射: ϕ ( x ) : X → H \phi(x):\mathcal X\rightarrow \mathcal H ϕ(x):XH

使得对所有 x , z ∈ X x,z\in\mathcal X x,zX,函数 K ( k , z ) K(k,z) K(k,z)满足条件: K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) K(x,z)=\phi(x)\cdot\phi(z) K(x,z)=ϕ(x)ϕ(z)

则称 K ( k , z ) K(k,z) K(k,z)为核函数, ϕ ( x ) \phi(x) ϕ(x)为映射函数,式中 ϕ ( x ) ⋅ ϕ ( z ) \phi(x)\cdot\phi(z) ϕ(x)ϕ(z) ϕ ( x ) \phi(x) ϕ(x) ϕ ( z ) \phi(z) ϕ(z)的内积。核技巧的想法是,在学习与预测中只定义核函数 K ( k , z ) K(k,z) K(k,z),而不显式地定义映射函数 ϕ \phi ϕ。通常,直接计算 K ( k , z ) K(k,z) K(k,z)比较容易,而通过 ϕ ( x ) \phi(x) ϕ(x) ϕ ( z ) \phi(z) ϕ(z)计算 K ( k , z ) K(k,z) K(k,z)并不容易。下面是一个例子来说明核函数和映射函数的关系。

例题 假设输入空间是 R 2 \bold R^2 R2,核函数是 K ( k , z ) = ( x ⋅ z ) 2 K(k,z)=(x\cdot z)^2 K(k,z)=(xz)2,试找出其相关的特征空间 H \mathcal H H和映射 ϕ ( x ) : R 2 → H \phi(x):\bold R^2\rightarrow\mathcal H ϕ(x):R2H

取特征空间 H = R 3 \mathcal H=\bold R^3 H=R3,记 x = ( x ( 1 ) , x ( 2 ) ) T x=(x^{(1)},x^{(2)})^{\rm T} x=(x(1),x(2))T z = ( z ( 1 ) , z ( 2 ) ) T z=(z^{(1)},z^{(2)})^{\rm T} z=(z(1),z(2))T,由于: x ⋅ z = ( x ( 1 ) z ( 1 ) + x ( 2 ) z ( 2 ) ) 2 = ( x ( 1 ) z ( 1 ) ) 2 + 2 x ( 1 ) z ( 1 ) x ( 2 ) z ( 2 ) + ( x ( 2 ) z ( 2 ) ) 2 x\cdot z=(x^{(1)}z^{(1)}+x^{(2)}z^{(2)})^2=(x^{(1)}z^{(1)})^2+2x^{(1)}z^{(1)}x^{(2)}z^{(2)}+(x^{(2)}z^{(2)})^2 xz=(x(1)z(1)+x(2)z(2))2=(x(1)z(1))2+2x(1)z(1)x(2)z(2)+(x(2)z(2))2

所以可以取映射: ϕ ( x ) = ( ( x ( 1 ) ) 2 , 2 x ( 1 ) x ( 2 ) , ( x ( 2 ) ) 2 ) T \phi(x)=((x^{(1)})^2,\sqrt2x^{(1)}x^{(2)},(x^{(2)})^2)^{\rm T} ϕ(x)=((x(1))2,2 x(1)x(2),(x(2))2)T

容易验证 ϕ ( x ) ⋅ ϕ ( z ) = ( x ⋅ z ) 2 = K ( x , z ) \phi(x)\cdot\phi(z)=(x\cdot z)^2=K(x,z) ϕ(x)ϕ(z)=(xz)2=K(x,z)。仍取 H = R 3 \mathcal H=\bold R^3 H=R3以及: ϕ ( x ) = 1 2 ( ( x ( 1 ) ) 2 − ( x ( 2 ) ) 2 , 2 x ( 1 ) x ( 2 ) , ( x ( 1 ) ) 2 + ( x ( 2 ) ) 2 ) T \phi(x)=\frac{1}{\sqrt2}((x^{(1)})^2-(x^{(2)})^2,2x^{(1)}x^{(2)},(x^{(1)})^2+(x^{(2)})^2)^{\rm T} ϕ(x)=2 1((x(1))2(x(2))2,2x(1)x(2),(x(1))2+(x(2))2)T

同样有 ϕ ( x ) ⋅ ϕ ( z ) = ( x ⋅ z ) 2 = K ( x , z ) \phi(x)\cdot\phi(z)=(x\cdot z)^2=K(x,z) ϕ(x)ϕ(z)=(xz)2=K(x,z)。还可以取 H = R 4 \mathcal H=\bold R^4 H=R4以及: ϕ ( x ) = ( ( x ( 1 ) ) 2 , x ( 1 ) x ( 2 ) , x ( 1 ) x ( 2 ) , ( x ( 2 ) ) 2 ) T \phi(x)=((x^{(1)})^2,x^{(1)}x^{(2)},x^{(1)}x^{(2)},(x^{(2)})^2)^{\rm T} ϕ(x)=((x(1))2,x(1)x(2),x(1)x(2),(x(2))2)T

核技巧应用在支持向量机中 我们注意到在线性支持向量机的对偶问题中,无论是目标函数还是决策函数都只涉及输入实例与实例之间的内积。在对偶问题的目标函数中的内积 x i ⋅ x j x_i\cdot x_j xixj可以用核函数 K ( x i , x j ) = ϕ ( x i ) ⋅ ϕ ( x j ) K(x_i,x_j)=\phi(x_i)\cdot\phi(x_j) K(xi,xj)=ϕ(xi)ϕ(xj)来代替。因此,式(11)对偶问题的目标函数变为: W ( α ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i W(\alpha)=\frac{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 W(α)=21i=1Nj=1NαiαjyiyjK(xi,xj)i=1Nαi

同样,分类决策函数中的内积也可以用核函数代替,即:
f ( x ) = s i g n ( ∑ i = 1 N s a i ∗ y i ϕ ( x i ) ⋅ ϕ ( x ) + b ∗ ) = s i g n ( ∑ i = 1 N s a i ∗ y i K ( x i , x ) + b ∗ ) \begin{aligned} f(x)&={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_i\phi(x_i)\cdot\phi(x)+b^*\right)\\ &={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_iK(x_i,x)+b^*\right) \end{aligned} f(x)=sign(i=1Nsaiyiϕ(xi)ϕ(x)+b)=sign(i=1NsaiyiK(xi,x)+b)

在核函数 K ( k , z ) K(k,z) K(k,z)给定的条件下,可以利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行的,不需要显式地定义特征空间的映射函数。这就是核技巧

1.6.2 正定核

已知映射函数 ϕ \phi ϕ,可以通过 ϕ ( x ) \phi(x) ϕ(x) ϕ ( z ) \phi(z) ϕ(z)的内积求得核函数 K ( k , z ) K(k,z) K(k,z)。不同构造映射能否直接判断一个给定的函数 K ( k , z ) K(k,z) K(k,z)是不是核函数?其实,通常我们所说的核函数就是正定核函数,下面给出正定核的充要条件。

正定核的充要条件 K : X × X → R K:\mathcal X×\mathcal X\rightarrow R K:X×XR是对称函数,则 K ( k , z ) K(k,z) K(k,z)为正定核函数的充要条件是对任意 x i ∈ X , i = 1 , 2 , . . . , m x_i\in\mathcal X,i=1,2,...,m xiX,i=1,2,...,m K ( k , z ) K(k,z) K(k,z)对应的 G r a m {\rm Gram} Gram矩阵: K = [ K ( x i , x j ) ] m × m K=[K(x_i,x_j)]_{m×m} K=[K(xi,xj)]m×m

是半正定的。

正定核的等价定义 X ⊂ R n \mathcal X\sub\bold R^n XRn K ( k , z ) K(k,z) K(k,z)是定义在 X × X \mathcal X×\mathcal X X×X上的对称函数,如果对任意 x i ∈ X , i = 1 , 2 , . . . , m x_i\in\mathcal X,i=1,2,...,m xiX,i=1,2,...,m K ( k , z ) K(k,z) K(k,z)对应的 G r a m {\rm Gram} Gram矩阵: K = [ K ( x i , x j ) ] m × m K=[K(x_i,x_j)]_{m×m} K=[K(xi,xj)]m×m

是半正定矩阵,则称 K ( k , z ) K(k,z) K(k,z)是正定核。这一定义在构造核函数时很有用。但对于一个具体函数 K ( k , z ) K(k,z) K(k,z)来说,检验它是否为正定核函数并不容易,因为要求对任意有限输入集 { x 1 , x 2 , . . . , x m } \{x_1,x_2,...,x_m\} {x1,x2,...,xm}验证 K K K对应的 G r a m {\rm Gram} Gram矩阵是否为半正定的。在实际问题中往往应用已有的核函数。

1.6.3 常用核函数

1.6.3.1 多项式核函数

K ( x , z ) = ( x ⋅ z + 1 ) p K(x,z)=(x\cdot z+1)^p K(x,z)=(xz+1)p

对应的支持向量机是一个 p p p次多项式分类器。在此情形下,分类决策函数成为: f ( x ) = s i g n ( ∑ i = 1 N s a i ∗ y i ( x i ⋅ x + 1 ) p + b ∗ ) f(x)={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_i(x_i\cdot x+1)^p+b^*\right) f(x)=sign(i=1Nsaiyi(xix+1)p+b)

1.6.3.2 高斯核函数

K ( x , z ) = exp ⁡ ( − ∣ ∣ x − z ∣ ∣ 2 2 σ 2 ) K(x,z)=\exp\left(-\frac{||x-z||^2}{2\sigma^2}\right) K(x,z)=exp(2σ2xz2)

对应的支持向量机是高斯径向基函数分类器。在此情形下,分类决策函数成为: f ( x ) = s i g n ( ∑ i = 1 N s a i ∗ y i exp ⁡ ( − ∣ ∣ x − z ∣ ∣ 2 2 σ 2 ) + b ∗ ) f(x)={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_i\exp\left(-\frac{||x-z||^2}{2\sigma^2}\right)+b^*\right) f(x)=sign(i=1Nsaiyiexp(2σ2xz2)+b)

1.6.3.3 字符串核函数

考虑一个有限字符表 ∑ \sum 。字符串 s s s是从 ∑ \sum 中取出的有限个字符的序列,包括空字符串。字符串 s s s的长度用 ∣ s ∣ |s| s表示,它的元素记作 s ( 1 ) s ( 2 ) . . . s ( ∣ s ∣ ) s(1)s(2)...s(|s|) s(1)s(2)...s(s)。两个字符串 s s s t t t的连接记作 s t st st。所有长度为 n n n的字符串的集合记作 ∑ n \sum^n n,所有字符串的集合记作 ∑ ∗ = ⋃ n = 0 ∞ ∑ n \sum^*=\bigcup \limits_{n=0}^\infty\sum^n =n=0n

考虑字符串 s s s的子串 u u u。给定一个指标序列 i = { i 1 , i 2 , . . . , i ∣ u ∣ } i=\{i_1,i_2,...,i_{|u|}\} i={i1,i2,...,iu} 1 ≤ i 1 < i 2 < . . . < i ∣ u ∣ ≤ ∣ s ∣ 1\leq i_1<i_2<...<i_{|u|}\leq|s| 1i1<i2<...<ius s s s的子串定义为 u = s ( i ) = s ( i 1 ) s ( i 2 ) . . . s ( i ∣ u ∣ ) u=s(i)=s(i_1)s(i_2)...s(i_{|u|}) u=s(i)=s(i1)s(i2)...s(iu),其长度记作 l ( i ) = i ∣ u ∣ − i 1 + 1 l(i)=i_{|u|}-i_1+1 l(i)=iui1+1。如果 i i i是连续的,则 l ( i ) = ∣ u ∣ l(i)=|u| l(i)=u;否则, l ( i ) > ∣ u ∣ l(i)>|u| l(i)>u

假设 S \mathcal S S是长度大于或等于 n n n的字符串集合, s s s S \mathcal S S的元素。现在建立字符串集合 S \mathcal S S到特征空间 H n = R ∑ n \mathcal H_n=R^{\sum^n} Hn=Rn的映射 ϕ n ( s ) \phi_n(s) ϕn(s) R ∑ n R^{\sum^n} Rn表示定义在 ∑ n \sum^n n上的实数空间,其每一维对应一个字符串 u ∈ ∑ n u\in\sum^n un,映射 ϕ n ( s ) \phi_n(s) ϕn(s)将字符串 s s s对应于空间 R ∑ n R^{\sum^n} Rn的一个向量,其在 u u u维的取值为: [ ϕ u ( s ) ] u = ∑ i : s ( i ) = u λ l ( i ) [\phi_u(s)]_u=\sum_{i:s(i)=u}\lambda^{l(i)} [ϕu(s)]u=i:s(i)=uλl(i)

这里, 0 < λ ≤ 1 0<\lambda\leq1 0<λ1是一个衰减系数, l ( i ) l(i) l(i)表示字符串 i i i的长度,求和在 s s s中所有与 u u u相同的子串上进行。两个字符串 s s s t t t上的字符串核函数是基于映射 ϕ n \phi_n ϕn的特征空间中的内积: k n ( s , t ) = ∑ n ∈ ∑ n [ ϕ u ( s ) ] u [ ϕ u ( t ) ] u = ∑ n ∈ ∑ n ∑ ( i , j ) : s ( i ) = t ( j ) = u λ l ( i ) λ l ( j ) \begin{aligned} k_n(s,t)&=\sum_{n\in\sum^n}[\phi_u(s)]_u[\phi_u(t)]_u\\&=\sum_{n\in\sum^n}\sum_{(i,j):s(i)=t(j)=u}\lambda^{l(i)}\lambda^{l(j)} \end{aligned} kn(s,t)=nn[ϕu(s)]u[ϕu(t)]u=nn(i,j):s(i)=t(j)=uλl(i)λl(j)

字符串核函数 k n ( s , t ) k_n(s,t) kn(s,t)给出了字符串 s s s t t t中长度等于 n n n的所有子串组成的特征向量的余弦相似度。直观上,两个字符串相同的子串越多,它们就越相似,字符串核函数的值就越大。

1.6.4 非线性支持向量分类机

非线性支持向量机

从非线性分类训练集,通过核函数与软间隔最大化,或凸二次规划,学习得到的分类决策函数: f ( x ) = s i g n ( ∑ i = 1 N s a i ∗ y i K ( x i , x ) + b ∗ ) f(x)={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_iK(x_i,x)+b^*\right) f(x)=sign(i=1NsaiyiK(xi,x)+b)

称为非线性支持向量机, K ( x , z ) K(x,z) K(x,z)是正定核函数。

非线性支持向量机学习算法

输入 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N

输出 分类决策函数。

(1)选取适当的核函数 K ( x , z ) K(x,z) K(x,z)和适当的参数 C C C,构造并求解最优化问题: min ⁡ α    1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i \min_{\alpha}\ \ \frac{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 αmin  21i=1Nj=1NαiαjyiyjK(xi,xj)i=1Nαi

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

0 ≤ α i ≤ C ,   i = 1 , 2 , . . . , N 0\leq\alpha_i\leq C,\ i=1,2,...,N 0αiC, i=1,2,...,N

求得最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^{\rm T} α=(α1,α2,...,αN)T

(2)选择选择 α ∗ \alpha^* α的一个正分量满足条件 0 < α j ∗ < C 0<\alpha_j^*<C 0<αj<C,计算: b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ y j ) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i\cdot y_j) b=yji=1Nαiyi(xiyj)

(3)构造决策函数: f ( x ) = s i g n ( ∑ i = 1 N s a i ∗ y i K ( x i , x ) + b ∗ ) f(x)={\rm sign}\left(\sum_{i=1}^{N_s}a_i^*y_iK(x_i,x)+b^*\right) f(x)=sign(i=1NsaiyiK(xi,x)+b)

K ( x , z ) K(x,z) K(x,z)是正定核时,上述问题时凸二次规划问题,解是存在的。


2. 序列最小最优化算法

支持向量机的学习问题可以形式化为凸二次规划问题。这样的凸二次规划问题具有全局最优解,并且有许多优化算法可以求解这一问题。现在介绍一种高效的求解方法, S M O {\rm SMO} SMO算法。要求解以下凸二次规划的对偶问题: min ⁡ α    1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i \min_{\alpha}\ \ \frac{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 αmin  21i=1Nj=1NαiαjyiyjK(xi,xj)i=1Nαi

s . t .   ∑ i = 1 N α i y i = 0 s.t.\ \sum_{i=1}^N\alpha_iy_i=0 s.t. i=1Nαiyi=0

0 ≤ α i ≤ C ,   i = 1 , 2 , . . . , N 0\leq\alpha_i\leq C,\ i=1,2,...,N 0αiC, i=1,2,...,N

S M O {\rm SMO} SMO算法的思路是:如果所有变量的解都满足此最优化问题的 K K T {\rm KKT} KKT条件,那么这个最优化问题的解就得到了。因为 K K T {\rm KKT} KKT条件是该优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,这会使得原始二次规划问题的目标函数值变得更小。 S M O {\rm SMO} SMO算法将原始问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。即, S M O {\rm SMO} SMO算法包括两个部分:求解两个变量二次规划的解析方法选择变量的启发式方法

2.1 两个变量二次规划的求解方法

不失一般性,假设选择的两个变量是 α 1 , α 2 \alpha_1,\alpha_2 α1,α2,其他变量 α i ( i = 3 , 4 , . . , N ) \alpha_i(i=3,4,..,N) αi(i=3,4,..,N)是固定的。于是 S M O {\rm SMO} SMO的最优化问题的子问题可以写作: min ⁡ α 1 , α 2     W ( α 1 , α 2 ) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 − ( α 1 + α 2 ) + y 1 α 1 ∑ i = 3 N y i α i K i 1 + y 2 α 2 ∑ i = 3 N y i α i K i 2 \min_{\alpha_1,\alpha_2}\ \ \ W(\alpha_1,\alpha_2)=\frac{1}{2}K_{11}\alpha_1^2+\frac{1}{2}K_{22}\alpha_2^2+y_1y_2K_{12}\alpha_1\alpha_2-\\(\alpha_1+\alpha_2)+y_1\alpha_1\sum_{i=3}^Ny_i\alpha_iK_{i1}+y_2\alpha_2\sum_{i=3}^Ny_i\alpha_iK_{i2} α1,α2min   W(α1,α2)=21K11α12+21K22α22+y1y2K12α1α2(α1+α2)+y1α1i=3NyiαiKi1+y2α2i=3NyiαiKi2

s . t .   α 1 y 1 + α 2 y 2 = − ∑ i = 3 N y i α i = ς s.t.\ \alpha_1y_1+\alpha_2y_2=-\sum_{i=3}^Ny_i\alpha_i=\varsigma s.t. α1y1+α2y2=i=3Nyiαi=ς

0 ≤ α i ≤ C ,    i = 1 , 2 (16) 0\leq\alpha_i\leq C,\ \ i=1,2\tag{16} 0αiC,  i=1,2(16)

其中, K i j = K ( x i , x j ) , i , j = 1 , 2 , . . . , N K_{ij}=K(x_i,x_j),i,j=1,2,...,N Kij=K(xi,xj),i,j=1,2,...,N ς \varsigma ς是常数。

定理 最优化问题(16)沿着约束方向未经剪辑的解是: α 2 n e w , u n c = α 2 o l d + y 2 ( E 1 − E 2 ) η (17) \alpha_2^{\rm new,unc}=\alpha_2^{\rm old}+\frac{y_2(E_1-E_2)}{\eta}\tag{17} α2new,unc=α2old+ηy2(E1E2)(17)

其中, η = K 11 + K 22 − 2 K 12 \eta=K_{11}+K_{22}-2K_{12} η=K11+K222K12。经剪辑后的 α 2 \alpha_2 α2的解是: α 2 n e w = { H , α 2 n e w , u n c > H α 2 n e w , u n c , L ≤ α 2 n e w , u n c ≤ H L , α 2 n e w , u n c < L (18) \alpha_2^{\rm new}=\left\{ \begin{aligned} &H, & & \alpha_2^{\rm new,unc}>H \\ &\alpha_2^{\rm new,unc}, & & L\leq\alpha_2^{\rm new,unc}\leq H \\ &L,& &\alpha_2^{\rm new,unc}<L \end{aligned} \right. \tag{18} α2new=H,α2new,unc,L,α2new,unc>HLα2new,uncHα2new,unc<L(18)

其中, L = max ⁡ ( 0 , α 2 o l d − α 1 o l d ) L=\max(0,\alpha_2^{\rm old}-\alpha_1^{\rm old}) L=max(0,α2oldα1old) H = min ⁡ ( C , C + α 2 o l d − α 1 o l d ) H=\min(C,C+\alpha_2^{\rm old}-\alpha_1^{\rm old}) H=min(C,C+α2oldα1old)。由 α 2 \alpha_2 α2求得 α 1 \alpha_1 α1 α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 2 n e w ) (19) \alpha_1^{\rm new}=\alpha_1^{\rm old}+y_1y_2(\alpha_2^{\rm old}-\alpha_2^{\rm new})\tag{19} α1new=α1old+y1y2(α2oldα2new)(19)

2.2 变量的选择方法

2.2.1 第1个变量的选择

S M O {\rm SMO} SMO算法将选择第 1 1 1个变量的过程称为外层循环。外层循环在训练样本中选择违反 K K T {\rm KKT} KKT条件最严重的样本点: α i = 0 ⇔ y i g ( x i ) ≥ 1 \alpha_i=0\Leftrightarrow y_ig(x_i)\geq1 αi=0yig(xi)1

0 < α i < C ⇔ y i g ( x i ) = 1 0<\alpha_i<C\Leftrightarrow y_ig(x_i)=1 0<αi<Cyig(xi)=1

α i = C ⇔ y i g ( x i ) ≤ 1 (20) \alpha_i=C\Leftrightarrow y_ig(x_i)\leq1\tag{20} αi=Cyig(xi)1(20)

其中, g ( x i ) = ∑ j = 1 N α j y j K ( x i , x j ) + b g(x_i)=\sum \limits_{j=1}^N\alpha_jy_jK(x_i,x_j)+b g(xi)=j=1NαjyjK(xi,xj)+b

2.2.2 第2个变量的选择

选择 α 2 \alpha_2 α2的标准是使其对应的 ∣ E 1 − E 2 ∣ |E_1-E_2| E1E2最大,其中: E i = g ( x i ) − y i = ( ∑ j = 1 N α j y j K ( x i , x j ) + b ) − y i ,   i = 1 , 2 , . . . , N E_i=g(x_i)-y_i=\left(\sum \limits_{j=1}^N\alpha_jy_jK(x_i,x_j)+b\right)-y_i,\ i=1,2,...,N Ei=g(xi)yi=(j=1NαjyjK(xi,xj)+b)yi, i=1,2,...,N

2.2.3 计算阈值 b b b和差值 E i E_i Ei

b 1 n e w = − E 1 − y 1 K 11 ( α 1 n e w − α 1 o l d ) − y 2 K 21 ( α 2 n e w − α 2 o l d ) + b o l d (21) b_1^{\rm new}=-E_1-y_1K_{11}(\alpha_1^{\rm new}-\alpha_1^{\rm old})-y_2K_{21}(\alpha_2^{\rm new}-\alpha_2^{\rm old})+b^{\rm old}\tag{21} b1new=E1y1K11(α1newα1old)y2K21(α2newα2old)+bold(21)

b 2 n e w = − E 2 − y 1 K 12 ( α 1 n e w − α 1 o l d ) − y 2 K 22 ( α 2 n e w − α 2 o l d ) + b o l d (22) b_2^{\rm new}=-E_2-y_1K_{12}(\alpha_1^{\rm new}-\alpha_1^{\rm old})-y_2K_{22}(\alpha_2^{\rm new}-\alpha_2^{\rm old})+b^{\rm old}\tag{22} b2new=E2y1K12(α1newα1old)y2K22(α2newα2old)+bold(22)

E i n e w = ∑ S y j α j K ( x i , x j ) + b n e w − y i (23) E_i^{\rm new}=\sum_Sy_j\alpha_jK(x_i,x_j)+b^{\rm new}-y_i\tag{23} Einew=SyjαjK(xi,xj)+bnewyi(23)

其中, S S S是所有支持向量的集合。

SMO算法

输入 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ X = R n x_i\in\mathcal X=\bold R^n xiX=Rn y i = { + 1 , − 1 } y_i=\{+1,-1\} yi={+1,1} i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,精度 ε \varepsilon ε;

输出 近似解 α ^ \hat\alpha α^

(1)取初值 α ( 0 ) = 0 \alpha^{(0)}=0 α(0)=0,令 k = 0 k=0 k=0

(2)选取优化变量 α 1 ( k ) , α 2 ( k ) \alpha_1^{(k)},\alpha_2^{(k)} α1(k),α2(k),解析求解两个变量的最优化问题,并求得最优解 α 1 ( k + 1 ) , α 2 ( k + 1 ) \alpha_1^{(k+1)},\alpha_2^{(k+1)} α1(k+1),α2(k+1),更新 α \alpha α α ( k + 1 ) \alpha^{(k+1)} α(k+1)

(3)若在精度 ε \varepsilon ε范围内满足停机条件: ∑ i = 1 N α i y i = 0 ,   0 ≤ α i ≤ C ,   i = 1 , 2 , . . . , N \sum_{i=1}^N\alpha_iy_i=0,\ 0\leq\alpha_i\leq C,\ i=1,2,...,N i=1Nαiyi=0, 0αiC, i=1,2,...,N

y i ⋅ g ( x i ) = { ≥ 1 , { x i ∣ α i = 0 } = 1 , { x i ∣ 0 < α i < C } ≤ 1 , { x i ∣ α i = C } y_i\cdot g(x_i)=\left\{ \begin{aligned} &\geq1, & & \{x_i|\alpha_i=0\} \\ &=1, & & \{x_i|0<\alpha_i<C\} \\ &\leq1,& &\{x_i|\alpha_i=C\} \end{aligned} \right. yig(xi)=1,=1,1,{xiαi=0}{xi0<αi<C}{xiαi=C}

其中, g ( x i ) = ∑ j = 1 N α j y j K ( x i , x j ) + b g(x_i)=\sum \limits_{j=1}^N\alpha_jy_jK(x_i,x_j)+b g(xi)=j=1NαjyjK(xi,xj)+b。则转(4);否则令 k = k + 1 k=k+1 k=k+1,转(2);

(4)取 α ^ = α ( k + 1 ) \hat\alpha=\alpha^{(k+1)} α^=α(k+1)


3. Python实现支持向量机

首先加载数据集:

def load_data(file):
    # 定义空列表
    dataArr = []
    labelArr = []
    # 打开并处理文件
    with open(file, "r") as f:
        lines = f.readlines()
        for line in lines:
            # 针对csv文件格式,使用','分割数据
            curLine = line.strip().split(',')
            # SVM是一个二分类算法,定义0-4为-1、5-9为+1
            # csv文件第一列存放着具体类别
            if int(curLine[0]) < 5:
                labelArr.append(-1)
            else:
                labelArr.append(1)
            # 处理具体数据,除以255归一化
            dataArr.append([int(num) / 255 for num in curLine[1:]])
        # 返回
        return dataArr, labelArr

定义SVM类,各函数功能请查看注释或者参考部分:

class SVM:
    def __init__(self, train_data, train_label, sigma=10, c=200, slack=0.001):
        super(SVM, self).__init__()
        self.train_data = np.mat(train_data)
        self.train_label = np.mat(train_label).T
        # m:训练集数据量,n:特征数目
        self.m, self.n = np.shape(self.train_data)
        # 高斯核参数
        self.sigma = sigma
        self.c = c
        self.slack = slack
        # 初始化核函数
        self.k = self.cal_kernel()
        self.b = 0
        self.alpha = [0] * self.train_data.shape[0]
        self.e = [0 * self.train_label[i, 0] for i in range(self.train_label.shape[0])]
        # 支持向量的索引
        self.support_vector_index = []

    def cal_kernel(self):
        # 使用高斯核
        k = [[0 for i in range(self.m)] for j in range(self.m)]
        # 遍历给k赋值
        for i in range(self.m):
            # 打印进度信息
            if i % 100 == 0:
                print("{} / {}".format(i, self.m))
            # x
            x = self.train_data[i, :]
            # 由于x·z = z·x,所以支序遍历一半元素加对角线
            for j in range(i, self.m):
                # z
                z = self.train_data[j, :]
                # 根据高斯核的公式
                result = (x - z) * (x - z).T
                result = np.exp(-1 * result / (2 * self.sigma ** 2))
                # 存放结果
                k[i][j] = result
                k[j][i] = result
        return k

    def is_satisfy_kkt(self, i):
        # 第i个alpha是否满足KKT条件,返回True或False
        gxi = self.cal_gxi(i)
        yi = self.train_label[i]
        # 根据式(20)中的第一个变量选择公式,根据不同情况分别处理,将式中的0换成松弛因子
        if (math.fabs(self.alpha[i]) < self.slack) and (yi * gxi >= 1):
            return True
        elif (math.fabs(self.alpha[i] - self.c) < self.slack) and (yi * gxi <= 1):
            return True
        elif (self.alpha[i] > -self.slack) and (self.alpha[i] < (self.c + self.slack)) \
                and (math.fabs(yi * gxi - 1) < self.slack):
            return True
        return False

    # https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/SVM/SVM.py#L156
    def cal_gxi(self, i):
        # 计算gxi,首先计算非零α的下标
        gxi = 0
        index = [i for i, alpha in enumerate(self.alpha) if alpha != 0]
        # 遍历每一个非零α
        for j in index:
            # 根据上式计算gxi
            gxi += self.alpha[j] * self.train_label[j] * self.k[j][i]
        # 偏置项
        gxi += self.b
        return gxi

    def cal_ei(self, i):
        gxi = self.cal_gxi(i)
        return gxi - self.train_label[i]

    # https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/SVM/SVM.py#L202
    def get_alpha_j(self, e1, i):
        # SMO选择第二个变量
        e2 = 0
        # 初始化|E1-E2|为-1
        max_e1_e2 = -1
        # 初始化第二个变量的下标
        max_index = -1
        # ei非零的索引
        no_zero_ei_index = [i for i, ei in enumerate(self.e) if ei != 0]
        # 遍历非零ei
        for j in no_zero_ei_index:
            # 计算e2
            e2_temp = self.cal_ei(j)
            # 是否更新最大值
            if math.fabs(e1 - e2_temp) > max_e1_e2:
                max_e1_e2 = math.fabs(e1 - e2_temp)
                e2 = e2_temp
                max_index = j
        # 随机选择零元素
        if max_index == -1:
            max_index = i
            while max_index == i:
                max_index = int(random.uniform(0, self.m))
            # 获得e2
            e2 = self.cal_ei(max_index)
        # 返回
        return e2, max_index

    def train_model(self, it=10):
        # 记录迭代次数
        iter_steps = 0
        # 迭代中记录参数改变次数
        param_changed = 1
        # 达到迭代次数或者模型收敛
        while (iter_steps < it) and (param_changed > 0):
            # 打印日志
            print("{} / {}".format(iter_steps, it))
            iter_steps += 1
            param_changed = 0
            # 遍历所有样本,找到SMO算法的第一个变量
            for i in range(self.m):
                # 是否满足KKT条件
                if not self.is_satisfy_kkt(i):
                    # 对不满足KKT条件的变量优化
                    e1 = self.cal_ei(i)
                    e2, j = self.get_alpha_j(e1, i)
                    # 根据上式
                    y1 = self.train_label[i]
                    y2 = self.train_label[j]
                    # 复制α值作为旧值
                    alpha_old_1 = self.alpha[i]
                    alpha_old_2 = self.alpha[j]
                    # 根据标签是否一致来生成不同的L和H
                    if y1 != y2:
                        l = max(0, alpha_old_2 - alpha_old_1)
                        h = min(self.c, self.c + alpha_old_2 - alpha_old_1)
                    else:
                        l = max(0, alpha_old_2 + alpha_old_1 - self.c)
                        h = min(self.c, alpha_old_2 + alpha_old_1)
                    # 如果l和h相等,则该变量无法继续优化,跳到下一个循环
                    if l == h:
                        continue
                    # 计算α新值,根据式(18)更新alpha2值
                    k11 = self.k[i][i]
                    k12 = self.k[i][j]
                    k21 = self.k[j][i]
                    k22 = self.k[j][j]
                    alpha_new_2 = alpha_old_2 + y2 * (e1 - e2) / (k11 + k22 - 2 * k12)
                    # 剪辑alpha2值
                    if alpha_new_2 < l:
                        alpha_new_2 = l
                    elif alpha_new_2 > h:
                        alpha_new_2 = h
                    # 更新alpha1
                    alpha_new_1 = alpha_old_1 + y1 * y2 * (alpha_old_2 - alpha_new_2)
                    # 根据式(21)和式(22)计算b1和b2的值
                    b_1_new = -1 * e1 - y1 * k11 * (alpha_new_1 - alpha_old_1) \
                              - y2 * k21 * (alpha_new_2 - alpha_old_2) + self.b
                    b_2_new = -1 * e2 - y1 * k12 * (alpha_new_1 - alpha_old_1) \
                              - y2 * k22 * (alpha_new_2 - alpha_old_2) + self.b
                    # 根据alpha1和alpha2的值确定新的b的值
                    if (alpha_new_1 > 0) and (alpha_new_1 < self.c):
                        b_new = b_1_new
                    elif (alpha_new_2 > 0) and (alpha_new_2 < self.c):
                        b_new = b_2_new
                    else:
                        b_new = (b_1_new + b_2_new) / 2
                    # 更新
                    self.alpha[i] = alpha_new_1
                    self.alpha[j] = alpha_new_2
                    self.b = b_new
                    self.e[i] = self.cal_ei(i)
                    self.e[j] = self.cal_ei(j)
                    # 如果alpha2的该变量过小,则视其没有改变
                    if math.fabs(alpha_new_2 - alpha_old_2) >= 0.00001:
                        param_changed += 1
        # 查找支持向量
        for i in range(self.m):
            if self.alpha[i] > 0:
                self.support_vector_index.append(i)

    def cal_single_kernel(self, x1, x2):
        # 单独计算核函数
        result = (x1 - x2) * (x1 - x2).T
        result = np.exp(-1 * result / (2 * self.sigma ** 2))
        return np.exp(result)

    def predict(self, x):
        result = 0
        # 遍历支持向量,计算求和式
        for i in self.support_vector_index:
        	# 根据式(23)
            temp = self.cal_single_kernel(self.train_data[i, :], np.mat(x))
            result += self.alpha[i] * self.train_label[i] * temp
        result += self.b
        return np.sign(result)

    def test_model(self, test_data, test_label):
        errorCnt = 0
        for i in range(len(test_data)):
            result = self.predict(test_data[i])
            if result != test_label[i]:
                errorCnt += 1
        return 1 - errorCnt / len(test_data)

4. 支持向量机总结

支持向量机是一种典型的二分类算法,在训练数据集线性可分时,使用最大间隔法的学习策略即可得到线性可分支持向量机。而现实中训练数据一般都是不可分的,或训练数据是近似线性可分的,这时可以引入松弛变量得到一个软间隔支持向量机。最后,对于输入空间中的非线性分类问题,可以通过非线性变换将它转化为某个高维特征空间中的线性分类问题,从而在高维特征空间中学习线性支持向量机。而这种变换通常是通过引入核函数实现。对于 S M O {\rm SMO} SMO算法,它是支持向量机的一种快速算法,其特点是不断地将元二次规划问题分解为只有两个变量的二次规划子问题,并对子问题进行解析求解,直到所有变量满足 K K T {\rm KKT} KKT条件为止。


参考

  1. 统计学习方法/李航著。—2版。—北京:清华大学出版社,2019(2019.6重印).
  2. https://github.com/Dod-o/Statistical-Learning-Method_Code(支持向量机代码).


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值