机器学习从0到1——9 支持向量机算法原理与代码实现

9.1线性分类器

线性函数计算简单,训练时易于求解,支持向量机(Support Vector Machine, SVM)是最大化分类间隔的线性分类器,如果使用核函数,可以解决非线性问题。

线性分类器是n维空间中的分类超平面,将空间切分成两部分。对于二维空间,是一条直线;对于三维空间,是一个平面;超平面是在更高维空间的推广。它的方程为:

w^{T}x+b=0

其中,x为输入向量,w是权重向量,b是偏置项,这两个参数通过训练得到。一个样本如果满足:

w^{T}x+b\geq 0

则被判定为正样本,否则被判定为负样本。下图是一个线性分类器对空间进行分隔的示意图。

直线将二维平面分成了两部分,落在直线左边的点被判定为第一类,落在直线右边的点被判定为第二类。线性分类器的判别函数可以写成:

\text{sgn}(w^{T}x+b)

sgn是符号函数,我们在机器学习简介中讲过。给定一个样本的向量,代入上面的函数,就可以得到它的类别值。

一般情况下,给定一组训练样本可以得到不止一个可行的线性分类器,如下图所示,图中两条直线都可以将两类样本分开。

那么在多个可行的线性分类器中,什么样的分类器是好的?从直观上看,为了得到好的泛化性能,分类平面应该不偏向于任何一类,并且离两个类的样本都尽可能远。这种最大化分类间隔的目标就是支持向量机的基本思想。

9.2线性可分的问题(硬间隔)

首先我们来看样本线性可分时的情况,即可以通过一个超平面将两类样本分开。这里类别的标签取+1和-1,分别对应正样本和负样本。设超平面方程为:

w^{T}x+b=0

对于正样本有:

w^{T}x+b\geq 0

对于负样本有:

w^{T}x+b< 0

可以统一写成下面的形式:

y^{(i)}(w^{T}x^{(i)}+b)\geq 0

其中,x^{(i)} 表示第i个样本的特征向量,y^{(i)} 表示第i个样本的标签。

支持向量机要求超平面离两类样本的距离尽可能大,根据点到平面的距离公式,每个样本离分类超平面的距离为:

d=\frac{\mid w^{T}x^{(i)}+b\mid}{\parallel w \parallel}

其中,\parallel w \parallel 是向量w的L2范数。将超平面方程两边同时乘上一个不等于0的常数,还是同一个超平面,利用这个特点可以化简求解的问题,对超平面方程的w和b加上如下约束:

\min\limits_{x_{i}}\mid w^{T}x^{(i)}+b\mid=1

这样对分类超平面的约束变成:

y^{(i)}(w^{T}x^{(i)}+b)\geq 1

分类超平面离两类样本之间的间隔为:

优化目标是使这个间隔最大化,这等价于最小化下面的目标函数:

\frac{\parallel w\parallel^{2}}{2}

加上前面的约束条件之后,求解的优化问题可以写成:

\min \frac{1}{2}w^{T}w

\text{s.t. }y^{(i)}(w^{T}x^{(i)}+b)\geq 1

上面的优化问题带有不等式约束,可以用拉格朗日对偶将其转化成对偶问题。下面我们讲解一下拉格朗日乘数法和拉格朗日对偶。

9.2.1拉格朗日乘数法

假设有如下极值问题:

\min f(x)

约束条件为:

\text{s.t. }h_{i}(x)=0,i=1,2,...,p

拉格朗日乘数法构造如下目标函数,称为拉格朗日函数:

L(x,\lambda)=f(x)+\sum\limits_{i=1}^{p}\lambda_{i}h_{i}(x)

其中,\lambda 是新引入的自变量,称为拉格朗日乘子,构造这个函数之后,就去掉了优化问题的等式约束。对上述所有自变量求偏导数,并令其为0.得到下列方程组:

\begin{cases} \nabla_{x}f+\sum\limits_{i=1}^{p}\lambda_{i}\nabla_{x}h_{i}=0\\ h_{i}(x)=0 \end{cases}

求解这个方程组即可得到函数的候选极值点。

9.2.2拉格朗日对偶

对偶是求解最优化问题的一种手段,它将一个最优化问题转化为另一个更容易求解的问题,这两个问题是等价的。对于如下带不等式约束和等式约束的优化问题:

\min f(x)

\text{s.t. }h_{i}(x)=0,i=1,2,...,p

\text{s.t. }g_{i}(x)\leq 0,i=1,2,...,m

仿照拉格朗日乘数法构造广义拉格朗日函数:

L(x,\lambda,\nu)=f(x)+\sum\limits_{i=1}^{p}\lambda_{i}h_{i}(x)+\sum\limits_{i=1}^{m}\nu_{i}g_{i}(x)

同样的,称\lambda\nu 为拉格朗日乘子,必须满足\nu_{i}\geq 0 的约束。接下来将上面的问题转化为如下原问题:

p^{*}=\min\limits_{x}\max\limits_{\lambda,\nu,\lambda_{i}\geq 0}L(x,\lambda,\nu)=\min\limits_{x}\theta_{P}(x)

\theta_{P}(x)=\max\limits_{\lambda,\nu,\lambda_{i}\geq 0}L(x,\lambda,\nu)

上面等式的含义是先固定住变量x,将其看成常数,调整\lambda\nu 对拉格朗日函数求最大值,消掉变量\lambda\nu 之后,再对变量x求最小值。这个原问题与最初的最小化问题有同样的解,感兴趣的可以自行进行证明。

接下来定义对偶问题:

d^{*}=\max\limits_{\lambda,\nu,\lambda_{i}\geq 0}\min\limits_{x}L(x,\lambda,\nu)=\max\limits_{\lambda,\nu,\lambda_{i}\geq 0}\theta_{D}(\lambda,\nu)

\theta_{D}(\lambda,\nu)=\min\limits_{x}L(x,\lambda,\nu)

上式和原问题的定义相反,先固定乘子\lambda 和​​​​​​​\nu ,让拉格朗日函数对x求极小值,然后再调整​​​​​​​\lambda 和​​​​​​​\nu 对函数求极大值。

原问题和对偶问题只是改变了求极大值和极小值的顺序,每次操控的变量是一样的。如果原问题和对偶问题都存在最优解,则对偶问题的最优值不大于原问题的最优值,即:

d^{*}\leq p^{*}

这里感兴趣的同学也可以自己证明。

如果d^{*}= p^{*} ,那么就可以把求解原问题转化为求解对偶问题,这个结论成立的前提条件是下面要讲述的Slater条件。

Slater条件指出,一个凸优化问题如果存在一个候选x严格满足所有不等式约束条件,即g_{i}<0 ,不等式不取等号,则存在x^{*}\lambda^{*}\nu^{*} 使得它们分别为原问题和对偶问题的最优解,则称为强对偶,即:

d^{*}= p^{*}=L(x^{*},\lambda^{*},\nu^{*})

强对偶只是将原问题转化成对偶问题,而这个对偶问题怎么求解则是另外一个问题。

9.2.3 KKT条件

对于带等式约束的最优化问题可以用拉格朗日乘数法求解,对于既有等式约束又有不等式约束的问题,也有类似的条件定义最优解,即KKT条件,它可以看作拉格朗日乘数法的扩展。对于如下优化问题:

\min f(x)

\text{s.t. }h_{i}(x)=0,i=1,2,...,p

\text{s.t. }g_{i}(x)\leq 0,i=1,2,...,m

和拉格朗日对偶的做法类似,KKT条件构成如下乘子函数:

L(x,\lambda,\mu)=f(x)+\sum\limits_{i=1}^{p}\lambda_{i}h_{i}(x)+\sum\limits_{i=1}^{m}\mu_{i}g_{i}(x)

\lambda\mu 称为KKT乘子,最优解x*满足如下条件:

\nabla_{x}L(x^{*})=0

\mu_{i}\geq 0

\mu_{i}g_{i}(x^{*})= 0

h_{i}(x^{*})=0

g_{i}(x^{*})\leq 0

等式约束h_{i}(x^{*})=0 和不等式约束g_{i}(x^{*})\leq 0 是优化问题本身应该满足的约束,\nabla_{x}L(x^{*})=0 和之前的拉格朗日乘数法一样,唯一多了一个条件\mu_{i}g_{i}(x^{*})= 0

可以分两种情况讨论,如果:

g_{i}(x^{*})< 0

要满足\mu_{i}g_{i}(x^{*})= 0 的条件,那么必须有\mu_{i}= 0 。如果:

g_{i}(x^{*})= 0

\mu_{i} 的取值只需要满足\mu_{i}\geq 0 即可。

9.2.4对偶问题

回到对于支持向量机的优化问题:

\min \frac{1}{2}w^{T}w

\text{s.t. }y^{(i)}(w^{T}x^{(i)}+b)\geq 1

目标函数的Hessian矩阵是n阶单位矩阵,它是严格正定矩阵,因此,目标函数是严格凸函数。可行域是由线性不等式围成的区域,是一个凸集。因此,这个优化问题是一个凸优化问题。由于样本是线性可分的,因此,一定存在w和b使得不等式约束严格满足,Slater条件成立,所以强对偶成立。

构造乘子函数:

L(w,b,\lambda)=\frac{1}{2}w^{T}w-\sum\limits^{l}_{i=1}\lambda_{i}(y^{(i)}(w^{T}x^{(i)}+b)-1)

约束条件为\lambda_{i}\geq 0 。由于强对偶成立,则原问题与对偶问题有相同的最优解:

\min\limits_{w,b}\max\limits_{\lambda}L(w,b,\lambda)=\max\limits_{\lambda}\min\limits_{w,b}L(w,b,\lambda)

我们先求解右边的对偶问题,即先固定住拉格朗日乘子\lambda ,调整w和b使得拉格朗日函数取极小值。把\lambda 看成常数,对w和b求偏导数并令它们为0,得到如下方程组:

\frac{\partial L}{\partial b}=0

\nabla_{w}L=0

从而得到:

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

w=\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}x^{(i)}

将上面两个解带入乘子函数消掉w和b:

接下来调整乘子\lambda ,使目标函数取得极大值:

\max_{\lambda}(-\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}(x^{(i)})^{T}x^{(j)})+\sum\limits_{i=1}^{l}\lambda_{i})

这等价于最小化下面的函数:

\min_{\lambda}(\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}(x^{(i)})^{T}x^{(j)})-\sum\limits_{i=1}^{l}\lambda_{i})

约束条件为:

\lambda_{i}\geq 0,i=1,2,...,l

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

求出\lambda 后,可以根据它计算出w:

w=\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}x^{(i)}

求解\lambda 可以使用顺序最小优化算法(Sequential Minimal Optimization,SMO)算法,后面我们会对该算法进行讲解。

9.3线性不可分问题(软间隔)

下面来看样本线性不可分时的情况,即无法通过一个超平面将两类样本分开,也就是说一些样本是不满足下面不等式的:

y^{(i)}(w^{T}x^{(i)}+b)\geq 1

那么可以通过使用松弛变量和惩罚因子对违反不等式约束的样本进行惩罚,可以得到如下优化问题:

\min \frac{1}{2}w^{T}w+C\sum\limits_{i=1}^{l}\xi_{i}

\text{s.t. }y^{(i)}(w^{T}x^{(i)}+b)\geq 1-\xi_{i}

\xi_{i}\geq 0,i=1,2,...,l

其中,\xi_{i} 是松弛变量,如果它不为0,表示样本违反了不等式约束条件;C是惩罚因子,是人工设定的大于0的参数,用来调整惩罚项的重要性。

如果令w=0,b=0,\xi_{i}=2 ,则有:

y^{(i)}(w^{T}x^{(i)}+b)=0>1-\xi_{i}=-1

不等式条件严格满足,则满足Slater条件,因此可以将该问题转化为对偶问题。

首先将不等式约束写成标准形式:

-(y^{(i)}(w^{T}x^{(i)}+b)- 1+\xi_{i})\leq 0

然后构造乘子函数:

L(w,b,\lambda,\xi,\beta)= \frac{1}{2}w^{T}w+C\sum\limits_{i=1}^{l}\xi_{i}-\sum\limits_{i=1}^{l}\lambda_{i}(y^{(i)}(w^{T}x^{(i)}+b)-1+\xi_{i})-\sum\limits_{i=1}^{l}\beta_{i}\xi_{i}

KKT条件为:

\lambda_{i}\geq 0

\beta_{i}\geq 0

-(y^{(i)}(w^{T}x^{(i)}+b)- 1+\xi_{i})\leq 0

-\xi_{i}\leq 0

\lambda_{i}(y^{(i)}(w^{T}x^{(i)}+b)- 1+\xi_{i})= 0

\beta_{i}\xi_{i}=0

​​​​​​​我们先求解对偶问题,首先固定住拉格朗日乘子\lambda\beta ,对w、b、\xi 求偏导并令它们为0,得到方程组:

\frac{\partial L}{\partial b}=0

\nabla_{w}L=0

\nabla_{\xi}L=0

得到:

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

w=\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}x^{(i)}

\lambda_{i}+\beta_{i}=C

将上面的解带入乘子函数中化简得到:

L(w,b,\lambda,\xi,\beta)= -\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}(x^{(i)})^{T}x^{(j)})+\sum\limits_{i=1}^{l}\lambda_{i}

求解上式的最大化问题等价于求解下面的最小化问题:

\min_{\lambda}(\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}(x^{(i)})^{T}x^{(j)})-\sum\limits_{i=1}^{l}\lambda_{i})

0\leq \lambda_{i}\leq C

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

与线性可分的对偶问题相比,唯一的区别是多了不等式约束\lambda_{i}\leq C 。将w的值带入超平面方程,得到分类决策函数为:

\text{sgn}((\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}x^{(i)})^{T}x+b)

对于KKT条件:

\lambda_{i}(y^{(i)}(w^{T}x^{(i)}+b)- 1+\xi_{i})= 0

分三种情况讨论。第一种情况,如果\lambda_{i}= 0 ,则y_{i}(w^{T}x_{i}+b)- 1+\xi_{i} 可以是任意值。由于对偶问题中有\lambda_{i}+\beta_{i}=C 的约束,因此\beta_{i}=C 。又因为\beta_{i}\xi_{i}=0 的约束,而C是大于0的数,因此\xi_{i}=0 。由于y^{(i)}(w^{T}x^{(i)}+b)\geq 1-\xi_{i} ,因此:

y^{(i)}(w^{T}x^{(i)}+b)\geq 1

当时\lambda_{i}\neq 0 ,则必须有y^{(i)}(w^{T}x^{(i)}+b)- 1+\xi_{i}= 0 ,即:

y^{(i)}(w^{T}x^{(i)}+b)= 1-\xi_{i}

第二种情况,如果0<\lambda_{i}<C ,由于\lambda_{i}+\beta_{i}=C ,因此\beta_{i}>0 ,又因为\beta_{i}\xi_{i}=0 ,因此\xi_{i}=0 ,所以:

y^{(i)}(w^{T}x^{(i)}+b)= 1

第三种情况,如果\lambda_{i}=C ,由于\lambda_{i}+\beta_{i}=C ,因此\beta_{i}=0 ,所以\xi_{i} 可以任意取大于0的数,因此:

y^{(i)}(w^{T}x^{(i)}+b)\leq 1

第一种情况对应的是自由变量(即非支持向量),第二种情况对应的是支持向量,可以据此计算出b的值,第三种对应的是违反不等式约束的样本。

9.4核映射与核函数

虽然加入松弛变量和惩罚因子之后可以处理线性不可分问题,但支持向量机还是一个线性分类器,只是允许错分样本的存在。核映射使得支持向量机成为非线性分类器,决策边界不再是线性的超平面,而可以是形状非常复杂的曲面。

如果样本线性不可分,可以对特征向量进行映射将它转化到更高维的空间,使得样本在该空间中线性可分,这种方法在机器学习中被称为核技巧。下图为核技巧的思想,第一张图是两类线性不可分的样本,第二张图通过核映射将样本特征向量转化到三维空间后则可以通过平面对样本进行划分,从而实现了非线性分类器。

核映射\phi 将特征向量变换到更高维的空间:

z=\phi(x)

在对偶问题中计算的是两个样本之间的内积,核映射后的结果为:

z_{i}^{T}z_{j}=\phi(x^{(i)})^{T}\phi(x^{(i)})

直接计算这个映射效率太低,而且不容易构造映射函数。如果映射函数\phi 的选取得当,存在函数K,使得下面等式成立:

K(x^{(i)},x^{(j)})=\phi(x^{(i)})^{T}\phi(x^{(j)})

这样只需用函数K进行变换,等价于先对向量做核映射,然后在做内积,从而简化计算。在这里我们看到了求解对偶问题的另外一个好处,对偶问题中出现的是样本特征向量之间的内积,而核函数刚好替代可以替代对特征向量进行核映射后的内积。满足上面等式的函数K称为核函数,常用的核函数包括:

线性核:K(x^{(i)},x^{(j)})=(x^{(i)})^{T}x^{(j)}

多项式核:K(x^{(i)},x^{(j)})=(\gamma (x^{(i)})^{T}x^{(j)}+b)^{d}

径向基函数核/高斯核:K(x^{(i)},x^{(j)})=exp(-\gamma \parallel x^{(i)}-x^{(j)}\parallel ^{2})

sigmoid核:K(x^{(i)},x^{(j)})=tanh(\gamma (x^{(i)})^{T}x^{(j)}+b)

核函数的精妙之处在于不用对特征向量做核映射再计算内积,而是直接对特征向量进行变换,这种变换等价于先对特征向量做核映射再计算内积。

需要注意的是,并不是任何函数都可以用来作为核函数,必须满足一定的条件,即Mercer条件。

Mercer条件指出:一个函数K(x,y)是核函数的条件是,对任意有限个样本的样本集,核矩阵半正定。核矩阵的元素是由样本中任意两个样本的内积构造的一个数,即:

K_{ij}=K(x^{(i)},x^{(j)})

为向量加上核映射后,前面要求解的对偶问题变为:

\min_{\lambda}(\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}\phi(x^{(i)})^{T}\phi(x^{(j)}))-\sum\limits_{i=1}^{l}\lambda_{i})

0\leq \lambda_{i}\leq C

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

等价于下面的问题:

\min_{\lambda}(\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}K(x^{(i)},x^{(j)}))-\sum\limits_{i=1}^{l}\lambda_{i})

0\leq \lambda_{i}\leq C

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

分类判别函数变成:

\text{sgn}(\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}K(x^{(i)},x^{(j)})+b)

与不用核映射相比,只是求解的目标函数、最后的判定函数对特征向量做了核函数变换。

9.5 SMO算法

顺序最小优化算法Sequential Minimal Optimization,SMO)要解决的是凸二次规划问题。凸二次规划问题的一般形式可以表示为:

\min \frac{1}{2}x^{T}Gx+cx^{T}

其中,G是Hessian矩阵,c和𝑥都是实数向量。如果Hessian矩阵是半正定的,则该问题称为凸二次规划。

我们的原始问题为:

\min_{\lambda}(\frac{1}{2}(\sum\limits_{i=1}^{l}\sum\limits_{j=1}^{l}\lambda_{i}\lambda_{j}y^{(i)}y^{(j)}K(x^{(i)},x^{(j)}))-\sum\limits_{i=1}^{l}\lambda_{i})

0\leq \lambda_{i}\leq C

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0

优化问题的向量矩阵表示形式为:

\min\limits_{\lambda}(\frac{1}{2}\lambda^{T}Q\lambda-e^{T}\lambda)

0\leq \lambda_{i}\leq C

y^{T}\lambda=0

Q与核矩阵的关系为:

Q_{ij}=y^{(i)}y^{(j)}K_{ij}

可以证明矩阵Q也是半正定的,所以优化问题是凸二次规划问题,可以用SMO算法求解。

SMO算法的基本思路是:如果所有的变量的解都满足此最优问题的KKT条件,那么这个最优问题的解就得到了,因为KKT条件是该最优化问题有解的充要条件。那么,我们可以每次选择两个变量进行优化,固定其它变量,针对这两个变量构建一个二次规划问题,这个二次规划的问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变小。算法包含两部分,第一部分是求解包含两个变量的二次规划的解析方法,另一部分是选择两个变量的方法。

9.5.1求解子问题

下面给出这两个变量的优化问题的求解方法。假设选取的两个分量为\lambda_{1}\lambda_{2} ,其他分量都固定(即看作常数)。由于类别标签取值+1或-1,所以y^{(1)}y^{(1)}=1y^{(2)}y^{(2)}=1 ,这两个变量的目标函数可以写成:

其中,c是一个常数,代表剩余常数项之和。推广到一般化的形式为:

上式中的\lambda_{k}^{*}\lambda_{k} 上一轮迭代之后的值。问题的约束条件可以写成:

\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}=0\Longrightarrow\lambda_{i}y^{(i)}+\lambda_{j}y^{(j)}=\varphi

\varphi 是一个常数。上式左右两边同时乘y^{(i)} ,等式变为:

\lambda_{i}y^{(i)}y^{(i)}+\lambda_{j}y^{(i)}y^{(j)}=y^{(i)}\varphi

则可以计算出\lambda_{i}

\lambda_{i}=y^{(i)}\varphi-\lambda_{j}y^{(i)}y^{(j)}

s=y^{(i)}y^{(j)}\gamma=y^{(i)}\varphi ,则:

\lambda_{i}=\gamma-s\lambda_{j}

\lambda_{i} 代入目标函数,则目标函数变为:

f(\lambda_{j})=\frac{1}{2}(\gamma-s\lambda_{j})^{2}K_{ii}+\frac{1}{2}\lambda_{j}^{2}K_{jj}+s(\gamma-s\lambda_{j})\lambda_{j}K_{ij}+(\gamma-s\lambda_{j})y^{(i)}\sum\limits_{k=1,k\neq i,k\neq j}^{l}\lambda_{k}^{*}y^{(k)}K_{ik}+\lambda_{j}y^{(j)}\sum\limits_{k=1,k\neq i,k\neq j}^{l}\lambda_{k}^{*}y^{(k)}K_{jk}-(\gamma-s\lambda_{j})-\lambda_{j}+c

令:

v_{i}=\sum\limits_{k=1,k\neq i,k\neq j}^{l}\lambda_{k}^{*}y^{(k)}K_{ik}

v_{j}=\sum\limits_{k=1,k\neq i,k\neq j}^{l}\lambda_{k}^{*}y^{(k)}K_{jk}

\lambda_{j} 求偏导并令导数为0,即可求得\lambda_{j} 的值。

即:

定义变量:

u_{i}=\sum\limits_{j=1}^{l}\lambda_{j}^{*}y^{(j)}K_{ij}+b

将s、\gamma\varphi 带入得到:

​​​​​​​

最后得到:

如果令:

\eta=K_{ii}+K_{jj}-2K_{ij}

E_{i}=u_{i}-y^{(i)}

上式可以化简为:

\lambda_{j}=\lambda_{j}^{*}+\frac{y_{j}(E_{i}-E_{j})}{\eta}

考虑约束条件0\leq \lambda_{i}\leq C\lambda_{i}\lambda_{j} 的取值只能在直线\lambda_{i}y^{(i)}+\lambda_{j}y^{(j)}=\varphi 上,且落在矩形[0,C]×[0,C]内。因此,SMO算法需要检查\lambda_{j} 的值以确认这个值落在约束区间之内。因为y_{i} 的取值只能是+1或-1,所以直线只可能是以下两种形式:

\lambda_{i}+\lambda_{j}=\varphi

\lambda_{i}-\lambda_{j}=\varphi

y^{(i)}\neq y^{(j)} 时,\lambda_{i}-\lambda_{j}=\varphi ,如下图所示,当\varphi 的取值为负时\lambda_{j}\in [-\varphi,C] ,对应图片上面的直线;当\varphi 的取值为正时\lambda_{j}\in [0,C-\varphi] ,对应下面的直线。

我们可以推出\lambda_{j} 的下界与上界L和H:

y^{(i)}= y^{(j)} 时,\lambda_{i}+\lambda_{j}=\varphi ,如下图所示,当\varphi 的取值大于C时\lambda_{j}\in [\varphi-C,C] ,对应图片上面的直线;当\varphi 的取值小于C时\lambda_{j}\in [0,\varphi] ,对应图片下面的直线。

同理我们可以推出此时\lambda_{j} 的下界与上界L和H:

因此,我们可以得到​​​​​​​\lambda_{j} 的最优解:

\lambda_{j}= \begin{cases} H,\text{ }\lambda_{j}^{uncut}>H\\ \lambda_{j}^{uncut},L\leq \lambda_{j}^{uncut}\leq H \\ L,\text{ }\lambda_{j}^{uncut}<L \end{cases}

其中,\lambda_{j}^{uncut} 就是我们最开始求得的:

\lambda_{j}=\lambda_{j}^{*}+\frac{y^{(j)}(E_{i}-E_{j})}{\eta}

在求得\lambda_{j} 后,可以进一步求得\lambda_{i}

\lambda_{i}y^{(i)}+\lambda_{j}y^{(j)}=\varphi\longrightarrow \lambda_{i}+\lambda_{j}y^{(i)}y^{(j)}=y^{(i)}\varphi

因为,\varphi 是常数,所以:

\lambda_{i}^{*}+\lambda_{j}^{*}y^{(i)}y^{(j)}=y^{(i)}\varphi

上面两个公式等号左右两边相减得到:

计算完参数\lambda_{i}\lambda_{j} 之后,还需要更新参数b。前面我们已经推导出分类判别函数为:

\text{sgn}(\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}K(x^{(i)},x^{(j)})+b)

因此有:

y^{(j)}-(\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}K(x^{(i)},x^{(j)})+b)=0

于是参数b的计算公式为:

b_{j}=y^{(j)}-\sum\limits_{i=1}^{l}\lambda_{i}y^{(i)}K(x^{(i)},x^{(j)})

b_{i}=y^{(i)}-\sum\limits_{j=1}^{l}\lambda_{j}y^{(j)}K(x^{(j)},x^{(i)})

b=\frac{b_{i}+b_{j}}{2}

9.5.2优化变量的选择

上面解决了变量求解的问题,下面来说明如何选择两个变量\lambda_{i}\lambda_{j} 。第一个变量选择不满足支持向量机KKT条件的那个样本。即判断样本是否满足我们在9.3节推导出的3种情况:

\lambda_{i}= 0\Longleftrightarrow y^{(i)}(w^{T}x^{(i)}+b)\geq 1

0<\lambda_{i}<C\Longleftrightarrow y^{(i)}(w^{T}x^{(i)}+b)= 1​​​​​​​

\lambda_{i}=C\Longleftrightarrow y^{(i)}(w^{T}x^{(i)}+b)\leq 1

对于选定的\lambda_{i} ,检查其是否满足KKT条件。如果不满足KKT条件(例如,当\lambda_{i}= 0 时,但y^{(i)}(w^{T}x^{(i)}+b)< 1 ),则将其选为需要优化的变量。如果满足KKT条件则继续遍历其他样本点,直到找到一个违反KKT条件的变量\lambda_{i} 。找到第一个优化变量\lambda_{i} 之后,接下来寻找\lambda_{j} ,选择的标准是使得\lambda_{j} 有足够大的变化。根据前面的推导,\lambda_{j} 的更新依赖于\mid E_{i}-E_{j}\mid 。因此,选择使得\mid E_{i}-E_{j}\mid 最大的\lambda_{j} 。由于\lambda_{i} 已经确定,因此E_{i} 已知。如果E_{i} 大于0,则选择最小的E_{j} ;如果E_{i} 小于0,则选择最大的E_{j}

9.6实验程序

# 支持向量机
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

data = load_breast_cancer()
X = data.data
y = data.target
print(X.shape)
print(np.unique(y))
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()
# 归一化处理
X = StandardScaler().fit_transform(X)


Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=42)
kernels = ["linear","poly","rbf","sigmoid"]
for kernel in kernels:
    clf = SVC(kernel=kernel).fit(Xtrain,Ytrain)
    print(kernel,":",clf.score(Xtest,Ytest))

代码下载地址:

链接:https://pan.baidu.com/s/1NFSBVqJ2y-fdUDp2_rZTXg

提取码:adpi

参考文献

雷明. 机器学习——原理、算法与应用.清华大学出版社.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值