支持向量机SVM
这篇文章是对http://www.cnblogs.com/pinard/p/6097604.html系列文章的理解和补充
感知机模型
感知机可以说是最古老的分类方法之一了,在1957年就已经推出。它的泛化能力不强,但是却是SVM,神经网络和深度学习的基础。
感知机的思想很简单,就是尝试找到一条直线,将平面上属于不同类别的点分开。如果找不到这样一条直线,说明数据是线性不可分的。使用感知机最大的一个前提是数据线性可分,这严重限制了感知机的使用场景,即使XOR数据使用感知机也会分类失败。另外即使数据线性可分,利用感知机找到的分类直线也不是唯一的,这和训练过程中的参数设置有关。SVM就从以上两点改进,通过最大化几何间隔改进第二个问题,通过引入核函数改进第一个问题。另外神经网络可以通过核函数和增加隐层使数据非线性可分。
感知机模型
假设有n个样本,每个样本对应有m维特征和一个二元类别输出,如下:
(x(1)1,x(1)2,...,x(1)m,y(1)),(x(2)1,x(2)2,...,x(2)m,y(2)),...,(x(n)1,x(n)2,...,x(n)m,y(n))
为了方便,这里二元类别不再是 {0,1} ,而是 {1,−1}
感知机模型可以定义为: y=sign(wTx) ,其中:
感知机的损失函数
根据感知机的模型,将 wTx>0 的样本类别取值为1,将 wTx<0 的样本类别取值为-1.因此正确分类的样本满足 y(wTx)>0 ,而错误分类的样本满足 y(wTx)<0 .损失函数的目标是希望错误分类的所有样本,到超平面的距离之和最短。
如何求一个点到超平面的距离?如图所示,以二维平面为例。设点x到直线的距离为r,x在直线上的投影为
x0
,直线的法线方向为w,所以点
x
可以表示为
所以点x到直线的距离为 r=(wTx+b)/∥w∥
对于错误分类的样本点,其到超平面的距离为 −y⋅wTx/∥w∥ (简单形式)
我们发现,超平面由参数
w
控制,当
我们假设所有错误分类的点的集合为M,则损失函数为
这里为了简化目标函数,将距离中的分母设置为1,在SVM中,通常将分子设置为1,这主要和优化算法有关。
损失函数的优化方法
知道了感知机的损失函数,就可以优化了。损失函数是一个凸函数,可以使用梯度下降。但是损失函数中的样本不是样本总体,而是那些错误分类的样本,所以不能使用整体的梯度下降算法,只能使用随机梯度下降或小批量梯度下降。
这里选择使用的是随机梯度下降,每次只利用一个错分样本更新参数。
损失函数基于 w 的偏导数为:
梯度下降的迭代公式为
由于采用随机梯度下降,每次只利用一个样本更新参数,所以参数的迭代公式为:
优化算法的执行步骤如下:
- 给定n个m维的训练样本和标签,定义所有样本的 x0 为1,选择初始的参数 w∈Rm+1 和步长 α 。需要注意的是,由于感知机的解不唯一,初始值的设定会影响最终的迭代效果。
- 根据参数 w ,选择一个误分类的点
- 对参数进行一次随机梯度下降迭代
- 检查样本中是否有误分类的点,如果没有,算法结束,如果有,转到2.
损失函数优化算法的对偶形式
上一节的感知机模型的算法形式我们一般称为感知机模型算法的原始形式。对偶形式是对算法执行速度的优化。具体是怎么优化的呢?
通过感知机算法的原始形式
其中 mj 为样本 x(j) 在迭代过程中因误分类而更新的次数。设置 mj 的初始值为0,每次对应的样本参与更新时, mj+1 。
由于 α 为常量,我们令 βj=αmj ,这样参数 w 的最终表达式为
根据上式,判断第i个样本是否误分的公式变为 y(i)∑nj=1βjy(j)x(j)⋅x(i)<0
注意,上面判断误差的形式里面,计算的是 x(j) 和 x(i) 的内积,而且这个内积在之后的计算中还会用到。如果我们事先计算所有样本的内积,在之后的运算中重用,能节省很多时间。
计算所有样本的内积的矩阵称为Gram矩阵,是一个对称矩阵,形式如下:
判断第j个样本是否错误分类时,需要用到矩阵G中的第j列。根据矩阵计算可以一次性判断所有样本是否误分类。设 β=[β1,β2,...,βn]T , F=y(βT∘yT)G,F∈Rn ,可以判断所有样本是否误分类。
利用对偶形式的算法步骤如下:
- 给定n个m维的训练样本和标签,定义所有样本的 x0 为1,选择初始的参数 β∈Rn 为0和步长 α 。需要注意的是,由于感知机的解不唯一,步长初始值的设定会影响最终的迭代效果。
- 计算所有样本的Gram矩阵
- 计算 F=y(βT∘yT)G ,判断F中是否有小于等于0的元素,如果有,对应的样本被误分。选择一个被误分的样本 x(i)
- 对 β 中的第i个分量更新: βi:=βi+α
- 重新计算 F=y(βT∘yT)G ,中第i个元素的值,判断F中是否有小于0的元素,如果没有,算法结束,如果有,转到3
为什么感知机的对偶算法要比原始算法的计算速度快?因为在原始算法中,每更新一次参数 w ,判断样本误分是要按照之前的步骤重新计算,但是对偶形式中利用了Gram矩阵,减少了运算量。
感知机小结
感知机算法简单易懂,但是泛化能力不强,不能处理线性不可分的数据,并且解不唯一。但是他是很多算法的鼻祖,比如SVM,神经网络和深度学习。感知机算法中距离的计算,目标函数的简化以及对偶优化算法,在SVM中还会再涉及。
线性SVM
上文讲到的感知机模型有几个缺点:1、解不唯一,对于线性可分的数据,可以找到不止一个超平面可以将数据分开,但是哪个超平面的泛化能力最强呢? 2、感知机模型对于线性不可分的数据分类失败。SVM可以说是感知机的一个改进,首先通过引进支持向量使得解唯一,然后通过引进软间隔支持极少数的异常点的线性数据,以及核函数支持非线性分类。
本节由感知机到SVM,讲解线性SVM的原理和推导过程。
首先感知机中的目标函数是使得所有误分点到超平面的距离和最小。也就是所,离超平面远的点是正确分类的,反而是离超平面比较近的点容易错误分类。如果我们让离超平面比较近的点尽可能远,那么我们的分类效果就会好一点。SVM的思想源于此。
SVM是让所有点离超平面的距离尽可能的大,我们假设大于一定的距离,我们要求一个超平面,使得离超平面最近的点尽可能的远。上面一再提到样本离超平面的距离,所以首先要解决的是如何求距离。然后是目标函数的设置和优化算法。
函数间隔和几何间隔
当分离超平面设置为
可以看出,它就是感知机中点到超平面的距离中的分子。训练集中n个样本点对应n个函数间隔,最小的一个是整个训练集的函数间隔。
函数间隔并不能反映点到超平面的距离,在感知机中我们也提到,当
w
和
同样,训练集中n个样本对应n个几何间隔,最小的一个是整个集合的几何间隔。
在感知机中提到,当
w
和
将式(1)中
w
和
所以几何间隔在固定了参数
w
和
支持向量
SVM的思想就是确定一个超平面,使得所有样本中离超平面最近的点尽量远。离超平面最近的这些点就称为支持向量。如下图所示,两条虚线上的点离超平面最近,称为支持向量。和这两条虚线平行并位于最中间的直线就是分类超平面。由图中还可以看出,如果分类超平面是 wTx+b=0 ,则两条虚线的公式分别为 wTx+b= 1何 wTx+b=−1 ,而且两条虚线的间隔是 2γ 。
线性SVM的目标函数
还是那句话,SVM使得所有样本中距离超平面最近的点离超平面最远。也就是说要使得整个样本的几何间隔最大。用数学式子表达就是:
(2)和(3)中的w和b同时除以 γ′=y(wTx+b) ,并使得(3)中不等式两边同时乘以 ∥w∥ ,得到
将最大化转为最小化可得
上式就是线性SVM的目标函数,加上系数是为了计算方便。这是一个约束优化问题,而且有n个约束条件,和之前介绍的logistic和感知机的目标函数是无约束优化问题不一样。可以用约束优化的方式解决。
由于目标函数 12∥w∥ 是凸函数,同时约束条件不等式是仿射的,可以利用对偶理论,通过拉格朗日函数将其转化为无约束的优化问题。
(原问题:
对偶问题:
如果 f(x) 和 Ci(x) 是凸函数,并 hj(x) 是仿射函数, x∗,α∗,β∗ 分别是原问题和对偶问题的最优解的充要条件是: x∗,α∗,β∗ 满足KKT条件
)
根据上面的对偶问题的理论,可以将SVM约束优化问题转化为无约束优化问题:
由于引进了拉格朗日乘子,目标为 minw,bmaxαi≥0L(w,b,α)
由于优化条件满足KKT,可以转化为等价的对偶问题来求解,即
我们可以先求优化函数对W,b的极小值,然后再求关于拉格朗日乘子 α 的极大值。
首先求解关于 w,b 的极小值,分别通过对 w,b 的求偏导得到
将上面两个等式带入(4)中:
最后对上式求极大化,转化为求极小化,得到
以上就是SVM的目标函数,只要求出 α=[α1,α2,...,αn]T 就可以求出w和b了。具体怎么求 α ,一般需要SMO算法。这里
根据对偶理论,假设得到了原问题和对偶问题的最优解 w∗,b∗,α∗ ,可以推导KKT条件如下:
假设已经求得最优的 α∗ ,那么根据 w∗=∑ni=1α∗iyixi 就可以求得w。求b则稍微麻烦一些。g根据KKT的第三个条件可知,当 α∗i>0 时, yi(w∗Txi+b∗)=1 ,表示样本 xi 离分类超平面的距离是1,即是支持向量。根据这个等式,可以求得b。找到所有的支持向量,即找到 α 中所有非零元素,对应的样本就是支持向量,然后根据上述等式求得相应的b,为了模型更加鲁棒,求它们的均值作为最终的b。
线性可分SVM算法过程
这里对线性可分SVM的算法做一个总结。
输入是线性可分的n个样本 (x1,y1),(x2,y2),...,(xn,yn) 。其中样本是m维向量,标签取值于 {1,−1} 。
输出是分离超平面的参数 w∗,b∗
算法过程如下:
构造约束优化问题
minα∑i=1n∑j=1nαiαjyiyj<xi,xj>−∑i=1nαis.t.∑i=1nαiyi=0andαi≥0,i=1,2,...,n用SMO算法求解上述问题对应的最有解 α∗
找出所有S个支持向量,即满足 αi>0 的样本
计算 w∗=∑i=1Sα∗iyixi ,计算W时只需利用支持向量相应的数据即可,因为非支持向量的 αi=0 ,在计算中不起作用。
对所有S个支持向量,通过 yi(wTxi+b)=1 ,(等式两边同乘 yi ,得到 wTxi+b=yi ,所以 b=yi−wTxi ,将(4)中计算得到的w带入)计算出每个支持向量对应的 bj=yj−∑Si=1αiyi<xi,xj> ,求平均值为最终的 b∗
最后超平面为 w∗x+b∗=0 ,最终的分类决策函数为 f(x)=sign(w∗x+b∗)
这样就得到最终的分类超平面: (w∗)Tx+b∗=(∑Si=1αiyixi)x+b∗=0 ,最终的分类器为: f(x)=sign((w∗)Txi+b∗)=sign(∑Si=1αiyixi)x+b)
线性可分SVM对于非线性数据是没有办法使用的,不可分的原因有两个。一是线性数据集中有少量异常点,由于这些异常点线性不可分,利用SVM的软间隔模型可以解决此类问题;二是数据本身是非线性的,需要引进核函数。
线性SVM软间隔最大化模型
有时候数据本身是线性可分的,也就是说可以用线性SVM来分类,但是却因为存在一些异常点,导致线性不可分。比如下图,本来数据可以按照下图的实线做超平面分离的,可是有一个橙色和一个蓝色的异常点导致分类失败。
另一种情况是数据仍然线性可分,但是会影响到泛化效果。如下图,如果不考虑异常点,SVM超平面应该是下图中红线所示,但是由于一个蓝色的异常点,导致我们学习到的超平面是下图中黑色虚线,这会严重影响到模型的泛化效果。
如何解决上述两个问题呢?SVM引入软间隔最大化的方法来解决。
线性分类SVM软间隔最大化模型
所谓软间隔,是相对硬间隔而言的。我们认为上节介绍的SVM模型是硬间隔最大化,即所有样本点到分离超平面的距离都大于等于1。而软间隔的条件可以放宽,只要求样本点到分离超平面的距离加上一个松弛变量后大于等于1,同时这些松弛变量也要作为惩罚加入目标函数。
硬间隔最大化: min12||w||22s.tyi(wTxi+b)≥1(i=1,2,...n)
软间隔最大化: min12||w||22+C∑ni=1ξis.t.yi(wTxi+b)≥1−ξiandξi≥0(i=1,2,...,n)
对比硬间隔最大化,软间隔最大化在两个地方做了改进。首先是约束条件:对每一个样本到分离超平面的距离加上了一个松弛变量,使得样本到超平面的距离的约束有所放松。另外加上这些松弛变量也要有代价,所以在目标函数上加上了对松弛变量的约束。这里 C>0 是惩罚函数,可以理解为一般回归和分类中的正则化参数。C越大,对误分类的惩罚越大,样本中被错误分类的点越少,但是支持向量的间隔越小。
也就是所,我们希望目标函数最小化,一方面要求支持向量离超平面尽量远,另一方面要求松弛变量尽量小。
软间隔最大化的目标函数和上一节介绍的硬间隔最大化模型的目标函数形式一样,都可以用对偶理论解决。
线性SVM软间隔最大化的目标函数
首先用拉格朗日函数将约束优化问题转化为无约束优化问题:
其中 αi≥0,μi≥0 是拉格朗日系数。
首先求 w,b,ξ 使 L(w,b,ξ,α,μ) 最小化,可以通过偏导数求解:
然后利用上面三个式子消除w和b
进过计算,第4行的式子和硬间隔最大化的函数一样,之后的计算过程也完全一样,最后得到的结果也一样,不过对拉格朗日系数的约束不一样。
之前对拉格朗日系数的约束只有两个,现在有4个,分别是
对第2,3,4三个式子,可以消去 μi ,得到
综上,软间隔最大化的目标函数为
软间隔最大化的目标函数和硬间隔最大化的目标函数只有一点不一样,就是对 α 的约束。
软间隔最大化的支持向量
硬间隔最大化的支持向量很好计算,求出最优的 α 之后,找到里面的非零元素,对应的样本即为支持向量。但是软间隔最大化由于加入的松弛变量,所以情况比较复杂。
下面左图是硬间隔最大化的分类情况,样本点的位置只有两种情况,在虚线的外侧和在虚线上,分别为正确分类的点和支持向量。右图是软间隔最大化的分类情况,样本点的位置有5中情况,分别为:
- 在虚线外且被正确分类,对模型的建设没有贡献
- 在虚线上且被正确分类,真正的支持向量
- 被正确分类但是在实线和虚线中间,如点1,2,4,这些也是支持向量
- 在实线上,这些点可以拒绝判断,也可以认为分类正确
- 被分类错误的点,在超平面的另一端且在虚线外,如点5
那么如何根据 α 判断这些点的位置呢?还要利用KKT条件:
现在基于 α∗ 对上面五种情况再做更详细的讨论:
- 当 αi=0 时,根据第三条, μi=C ,再根据第七条,得 ξi=0 ,然后再根据第四第五条得到 yi(wTxi+b)>1 ,即样本点离超平面的距离大于支持向量,在虚线之外;
- 当 0<αi<C 时,根据第三条, 0<μi<C ,在根据第七条,得 ξi=0 ,因为第四条,得到 yi(w∗Txi+b∗)−1+ξ∗i=0 ,所以 yi(wTxi+b)=1 ,即样本在虚线上;
- 当
αi=C
时,因为第四条,得到
yi(w∗Txi+b∗)−1+ξ∗i=0
,因为第三条,得到
μi=0
,由于第七条,得到
ξi>0
,说明此点异常,
ξi
还可以细分:
- αi=C,0<ξi<1 ,根据 yi(w∗Txi+b∗)=1−ξ∗i ,得到 0<yi(w∗Txi+b∗)<1 ,样本在虚线和实之间实线
- αi=C,ξi=1 ,根据 yi(w∗Txi+b∗)=1−ξ∗i ,得到 yi(w∗Txi+b∗)=0 ,样本在实线之上;
- αi=C,ξi>1 ,根据 yi(w∗Txi+b∗)=1−ξ∗i ,得到 yi(w∗Txi+b∗)<0 ,样本在实线的另一侧,别错误分类;
综上,可以得到以下结论,设 g(x)=wTx+b ,
支持向量对应的点满足 0<αi<C 。
在知道了各个样本对应的 α 之后,应该求出原始问题的解 w,b ,最后得到决策面。
软间隔最大化线性可分SVM的算法过程
输入是线性可分的m个样本 (x1,y1),(x2,y2),...,(xn,yn) ,,其中x为m维特征向量。y为二元输出,值为1,或者-1.
输出是分离超平面的参数w和b和分类决策函数。
算法过程如下:
选择一个惩罚系数 C>0 , 构造约束优化问题:
minα∑i=1,j=1nαiαjyiyj<xi,xj>−∑i=1nαis.t.{∑ni=1αiyi=00≤αi≤C用SMO算法求出上式对应的最优解 α
计算 w∗=∑i=1mα∗iyixi
找出所有S个支持向量,即满足 0<αi<C 的样本,通过 yig(xi)=1 ,计算出每个支持向量对应的 bj=yj−∑Si=1αiyi<xi,xj> ,求平均值为最终的 b∗
最后超平面为 w∗x+b∗=0 ,最终的分类决策函数为 f(x)=sign(w∗x+b∗)
合页损失函数
线性SVM软间隔最大化模型还有另一种表达形式,如下:
其中 [z]+={z,z>00,z≤0
此目标函数和软间隔最大化模型的目标函数等价(参考《统计学习方法》P114)
- ξi=[1−yi(wTxi+b)]+ ,表示松弛变量,也是经验损失函数,称为合页损失函数。当 yi(wTxi+b)>1 时,损失函数为0,表示分类正确。但是当 0<yi(wTxi+b)<1 ,仍然分类正确,损失函数却不为0,增加了分类的置信度。
- ||w||2 在(1)中表示的是正则项,在(2)代表的是支持向量和分类超平面的距离。越大,间隔越小。
-
λ=12C
,
λ
和
C
在两个目标函数中表示的都是正则化参数,不过正好成反比。
λ 越大,C越小,表示对松弛变量的约束越小,但是对距离的约束变大,间隔越大;相反 λ 越小,C越大,对松弛变量的约束变大,更少的点误分类,但是间隔变小,泛化能力下降。
下图为各种模型损失和函数间隔的关系。对于0-1损失函数,如果正确分类,损失是0,误分类损失1, 如下图黑线,可见0-1损失函数是不可导的。对于感知机模型,感知机的损失函数是
[−yi(wTxi+b)]+
,这样当样本被正确分类时,损失是0,误分类时,损失是
−yi(wTxi+b)
如下图紫线。对于逻辑回归之类和最大熵模型对应的对数损失,损失函数是
log[1+exp(−yi(wTxi+b))]
, 如下图红线所示。
非线性SVM
在上面两节中我们讲到了线性可分SVM和软间隔线性可分SVM,对于线性可分的数据或有个别异常点的数据可以很好的处理,但是遇到完全非线性可分的数据,就没有办法了。这一节介绍如何引进核函数处理非线性可分的数据。
我们知道,在低维空间中线性不可分的数据映射到高维空间的话线性可分。比如2维映射到5维,5为映射到10维。但是随着原始数据维数的增加,将其映射到的高维空间的维数呈爆炸式的增加。这是一个问题。
另外在线性SVM的目标函数中,样本数据是通过内积的形式存在的,如下是软间隔线性SVM的目标函数:
那么有没有办法,在低维空间中就可以计算映射后高维空间的内积,而不需要明确表示映射函数的办法呢?核函数就有这样的效果。
假设 ϕ 是一个从低维的输入空间 χ (欧式空间的子集或者离散集合)到高维的希尔伯特空间 H 的映射。那么如果存在函数 K(x,z) ,对于任意 x,z∈χ ,都有:
那么我们就称 K(x,z) 为核函数。
从核函数的定义中可知, ϕ 是从低维空间到高维空间的映射,核函数在低空维间中的计算,得到的是高维空间中的内积,避免了应用映射函数计算内积造成维数爆炸的麻烦。而且计算的内积在目标函数中可以直接使用,解决了所有的问题。
但是核函数又应该怎样计算呢?给出几个经常应用的,也是sklearn中默认可选的几个
线性核函数(Linear Kernel):线性核函数起始就是线性可分的SVM,表达式为:
K(xi,xj)=<xi,xj>将其应用到SVM中,还是线性SVM。所以线性和非线性SVM可以归为一类,区别在于核函数的选择。
多项式核函数(Polynomial Kernel):是常用的核函数之一,表达式为:
K(xi,xj)=(γ<xi,xj>+r)d其中 γ,r,d 需要调参定义。
高斯核函数(Gaussian Kernel):也称为径向基核函数(RBF),是最主流的核函数。表达式为:
K(xi,xj)=exp(−γ||xi−xj||2)其中 γ>0 ,需要调参定义。
sigmoid核函数(Sigmoid Kernel):也是常用的核函数之一,表达式为:
K(xi,xj)=tanh(γ<xi+xj>+r)其中, γ,r 需要调参定义。
有了核函数,可以很自然的从线性SVM过渡到非线性SVM。
下面给出SVM算法的流程,不再区分线性和非线性,利用的是软间隔分类模型:
选取合适的核函数 K(xi,xj) 和惩罚系数C,构造目标函数:
minα∑i=1,j=1nαiαjyiyjK(xi,xj)−∑i=1nαis.t.{∑ni=1αiyi=00≤αi≤C利用SMO算法求出最优解 α
计算 w=∑ni=1αiyiϕ(xi) ,这一步在实现中可以省略,因为不需要显式计算 w
找出所有S个支持向量,即满足
0<αi<C 对应的样本 (xs,ys) ,计算出对应的 bs=ys−∑Si=1αiyiK(xi,xs) ,所有支出向量对应的 bs 的平均为最终计算的 b最终的超平面为
wTϕ(x)+b=∑ni=1αiyiK(xi,x)+b=0 ,给定一个训练样本 xt ,决策函数为 f(xt)=sign(∑ni=1αiyiK(xi,xt)+b)
至此,SVM分类器的所有情况介绍完毕,唯一遗漏的是SMO算法,这关系到如何根据目标函数求出最优解。
SMO算法
在前面几节中,介绍了SVM的目标函数和决策函数,遗漏的是目标函数的求解,即得到一个最优的 α 向量。SMO(序列最小优化)是优化SVM目标函数的强大算法,将大问题分解为多个小问题进行优化,这些小问题很容易求解,对他们顺序求解的结果和作为整体求解的结果一致,而且SMO求解花费的时间少。
SMO算法的工作原理是:每次循环中选择两个 α 分量作为变量,其余分量固定为常数,优化这个简单的二次规划问题,直到所有的分量达到最优。SMO算法中主要有两个问题,一是如何找到两个合适的分量,二是如何优化简单的二次规划问题。先介绍第二个问题,再介绍第一个问题。
SMO算法目标函数的优化
SMO算法每次从n个变量中选择两个作为变量,其余固定作为常量。假设选择的两个变量是 α1,α2 ,其余变量 α3,α4,...,αn 固定作为常量,则目标函数可表示如下:
其中省略了一项常数项。 Kij=K(xi,xj) 。第一个约束条件是 α1,α2 的线性关系,所以 α1 可以被 α2 表示为 α1=y1(ς−α2y2) 。将此式带入目标函数得到:
其中 v1=∑i=3myiαiKi1,v2=∑i=3myiαiKi2
上述问题是一个单变量二次约束优化问题,目标函数是一条抛物线,约束条件是一个正方形区域。可以通过求导得到区域内的最优解。
对目标函数求倒数得到
整理上式有:
即
其中
E1=g(x1)−y1=∑ni=1yiαiK1ix1+b−y1,E2=g(x2)−y2=∑ni=1yiαiK2ix2+b−y2
,即设置初始的
α=[α1,...,αn]T
和
b
之后,计算
上面得到的 αnew,unc2 是在没有约束条件的 0≤α2≤C 的情况下得到的最优值。如果要得到满足约束条件的最优值,还需进一步计算。
根据约束条件 α1y1+α2y2=−∑i=3myiαi=ς,0≤α1,α2≤C ,第一个约束条件是一条直线,斜率只能是1或-1.第二个约束条件是正方形区域 ,如下图所示
直线可以表示为 α2=−y1y2α1+ςy2 ,当 y1≠y2 时,斜率为1,如左图,当 y1=y2 时,斜率为-1,如右图。
假设我们上一轮迭代得到的解是 αold1,αold2 ,沿着约束方向未经剪辑的解是 αnew,unc2 。本轮迭代完成后的解为 αnew1,αnew2
由于 αnew,unc2 必须满足上图中的线段约束。假设L和H分别是上图中 αnew2 所在的线段的边界。那么很显然我们有:
而对于L和H,我们也有限制条件。如果是上面左图中的情况,则
如果是上面右图中的情况,我们有:
综上,SMO两个变量的优化的步骤为:首先根据 αold1,αold2 求得 αnew,unc2 ,然后根据以下规则得到 αnew2
最后根据 α1=y1(ς−α2y2) 求得 αnew1 。
到此,对两个变量的跟新完成。
SMO算法两个变量的选择
在上一部分中介绍了选定两个分量作为变量时目标函数的优化。但是如何选取这两个分量呢?主要采用的是启发式的方法。
- 第一个变量的选择:第一个变量的选择称为外循环。其选择会在两种方式之间交替进行:一种方式是遍历所有数据集,另一种方式是在非边界 α(0<α<C) 中进行单边扫描,并选择违反KKT条件的样本。非边界样本满足的KKT条件是 0<αi<C⇒yig(xi)=1
- 第二个变量的选择:第二个变量的选择称为内循环。第二个变量的选择使得 |E1−E2| 有最大的变化。通常将 Ei 保存在一个列表中进行比较。
选择完两个变量之后要进行优化,在优化之前需要先判断这两个样本是否需要进行优化。首先计算H和L,如果H==L,重新选择第二个变量;如果 K11+K22−2K12≤0 ,优化问题不是开口向上的抛物线,需要进一步处理,也可以重新选择第二个变量。如果没有可选择的第二个变量,需要重新开始外循环,选择第一个变量。如果在计算出 αnewi 之后,发现 αi 没有改变,也需要重新选择第二个样本。直到遍历所有样本,变量都不需要改变时,算法停止。
计算b
在每次更新 αi,αj 之后,要重新计算b,因为之后计算 Ek 要用到b。
bnewi=bold−Ei−yi(αnewi−αoldi)Kii−yj(αnewj−αoldj)Kij
bnewj=bold−Ej−yj(αnewj−αoldj)Kjj−yi(αnewi−αoldi)Kij
当 0<αi,αj<C 时, bnewi=bnewj=b ,如果 αi 不满足, b=bnewj ,如果两者都不满足, b=(b=bnewi+bnewj)/2