还是老规矩,这一篇博客是对SVM进行介绍,下一篇博客就是使用SVM进行具体的使用。
SVM介绍
首先介绍SVM是什么,SVM(support vector machine)名为支持向量机,又名支持向量网络,是一个非常经典且高效的分类模型,是一种监督式的学习方法。
从名字上面来理解,SVM分为两个部分,"支持向量(support vector)"以及“机(machine)”。“machine”很简单的理解,就是算法的意思,那么“support vector”是什么呢? 这个现在不进行介绍,待我慢慢的引入。
线性分类
在介绍SVM之前,我们得先对线性分类器进行介绍。下面是一个二维平面的的分类问题,红色代表类别为+1
,蓝色的代表类别是-1
。中间的线就代表分割这两类问题的超平面。对于分类问题来说,红色和蓝色的点都是数据集中已知的,而我们的目的就是找到一个最适合的超平面,将数据进行分类。
对于线性二分类模型,给定一组数据{(x1,y1),(x2,y2),…,(xm,ym)}, 其中xi∈Rd,y∈{−1,1},二分类任务的目标是希望从数据中学得一个假设函数h:R→{−1,1},使得h(xi)=yi
h(xi)={1若yi=1−1若yi=−1(1)

那么问题来了,我们如何去寻找一个能够将yi=±1划分开的超平面?首先我们可以设超平面的函数是:
f(x)=wTx+b(2)
这里有一个值得注意的点,下面的这个公式会在后面的推导中经常用到。
y2i=1(3)
尽管有很多的问题都是线性不可分的,但是呢,目前我们只讨论线性可分问题,到后面我们再讨论如何将非线性问题转成线性问题。因此,暂时我们不需要去纠结如果是非线性问题怎么办。
我们可以直观的从图中进行感受,这样的超平面是有多个的,那么如何寻找一个最合适的超平面呢(也就是寻找最合适的wT 和b)?接下来引出间隔的概念来寻找最合适的超平面。
间隔
如下图所示,超平面f(x)=wTx+b,则x为x0到超平面的投影,x0对应的类别是y0,w为超平面的法向量,γ为x0到超平面的距离(带正负号)。

因此
γ=f(x0)||w||因此距离(不带正负号)的为:~γ=y0γ
这样我们就推出了间隔的表达式~γ=y0γ。对于给定的数据集,我们当然是希望数据集中的数据离超平面越远越好,因为这样所能够容忍的误差也就越大。那么这个远如何来确定呢?接下来让我们讨论什么是最大间隔分类器。
最大间隔分类器
如果我们给定如下的数据集,那么对于下面的数据集,哪一些最不可能分类成功呢?毋庸置疑的,就是最靠近f(x)=wTx+b超平面的数据点(比如下图中被红色和黄色圈出来的点)。而被圈出来的点也就是被称之为“支持向量”。因为在模型中我们考虑他们就可以了。

首先我们假设支持向量分布在ωTx+b=±1超平面上,这里取值为1只是为了方便,该值并不影响后面的优化结果。很显然,支持向量到超平面ωTx+b=±1的距离为1∥ω∥。两侧的距离加起来就是2∥ω∥。在前面我们说过,我们希望距离越大越好,也就是说2∥ω∥越大越好,同时对于数据集中数据的分布满足y(ωT+b)x⩾1。因此,我们得到了如下的优化问题:
⎧⎪⎨⎪⎩max2∥ω∥s.t.yi(ωTxi+b)⩾1,i=1,2,...,m(4)
为了方便后续的推导,该优化问题等价于:
⎧⎨⎩min12∥ω∥2s.t.yi(ωTxi+b)⩾1,i=1,2,...,m(5)
拉格朗日乘子法(Lagrange multipliers)
拉格朗日乘子法是一种寻找多元函数在一组约束下的极值的方法。通过引拉格朗日乘子,可将有 d个变量与k个约束条件的最优化问题转化为具有d+k个变量的无约束优化问题求解。下面让我们来进行推导。
拉格朗日乘子法推导
如下图所示z=f(x,y),g(x,y)=0,如果我们需要求z在g(x,y)条件下的极值。从几何角度来说,我们可以画出z=Ci的等高线,等高线与g(x,y)相切的点(x0,y0)即为极值点。如下图所示:

因为在点(x0,y0)取得极值,那么,∇f(x0,y0)//∇g(x0,y0),也就是说此时梯度平行。也就是说(fx′(x0,y0),fy′(x0,y0))//(gx′(x0,y0),gy′(x0,y0))(这个是可以证明的,但是在这里就不证明了)因此有:
fx′(x0,y0)gx′(x0,y0)=fy′(x0,y0)gy′(x0,y0)=−λ0(λ0可以为0)
即:
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩fx′(x0,y0)+λ0gx′(x0,y0)=0fy′(x0,y0)+λ0gy′(x0,y0)=0g(x,y)=0(6)
如果此时我们有一个辅助函数L(x,y,λ)=f(x,y)+λg(x,y),对其求偏导然后求极值点可得:
⎧⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪⎩∂L(x,y,λ)∂x=fx′(x,y)+λgx′(x,y)=0∂L(x,y,λ)∂y=fy′(x,y)+λgy′(x,y)=0∂L(x,y,λ)∂λ=g(x,y)=0(7)
显而易见公式(6)和公式(7)相等。因此我们对z=f(x,y)在条件f(x,y)=0的条件下求极值(x0,y0)的问题变成了求拉格朗日函数L(x,y,λ)=f(x,y)+λg(x,y)偏导数为0的解。
KKT条件(Karush-Kuhn-Tucker Conditions)
上面我们讨论的是在等式约束条件下求函数极值的问题(也就是g(x,y)=0)but,如果如果是不等式条件下,我们应该如何来使用拉格朗日函数来求解呢?下面引出KKT条件。
什么是KKT条件呢?它是在满足一些有规则的条件下,一个非线性规划问题能有最优化解法的一个必要条件。也就是说优化问题在最优值处必须满足KKT条件。
例如我们有以下优化问题:
minxf(x) s.t. hi(x)=0(i=1,…,m)gj(x)⩽0(j=1,…,n)(1)
其拉格朗日函数为:
L(x,λ,μ)=f(x)+m∑i=1λihi(x)+n∑j=1μjgj(x)(8)
则其KKT条件为:
⎧⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪⎩gj(x)⩽0μj⩾0μjgj(x)=0h(x)=0(2)
接下来让我们来解释一下为什么是这样的。(不一定是数学证明)。
下面我们只讨论f(x)在不等式gi(x)<0条件下取min情况。这里可能有人会说,如果我要求max怎么办?很简单那,将f(x)取反即可,就变成了求min的情况。同样对于gi(x)>0的情况,我们取反就变成了g′(x)=−gi(x)<0。
对于上述讨论,有两种情况如下图(图中x∗代表极小值点):
- 情况一:极小值点x∗在gi(x)<0的区域内
- 情况二:极小值点x∗在gi(x)=0上

首先我们先讨论情况二,对于情况二很好理解,此时的“不等式约束”变成了“等式约束”。那么其在极值点满足以下条件:
h(x)=0g(x)=0μ≥0(9)
h(x)=0,g(x)=0我们很好理解,但是为什么我们对μ还要进行限制呢?然后为什么限制还为μ≥0呢?首先我们来考虑一下f(x)和g(x)在x∗点的梯度方向(首先f(x)和g(x)在x∗点的梯度方向肯定是平行的【梯度的方向代表函数值增加最快的方向】)。
- 对于f(x)来说,等值线大小由中心到周围逐渐增大,因此它的梯度方向指向可行域。为图中红色的箭头号。
- 对于g(x)来说,梯度方向肯定是指向大于0的一侧,那么就是要背离可行域。为图中黄色的箭头号。

在前面拉格朗日乘子法中我们有以下推导:
fx′(x0,y0)gx′(x0,y0)=fy′(x0,y0)gy′(x0,y0)=−λ0(λ0可以为0)
又因为g(x)和f(x)梯度方向相反,因此λ0≥0。 因此对于公式9有μ≥0。
接下来让我们来讨论情况一。情况一是极小值$x^* 在g(x)$的可行域中,因此,我们可以将其看成没有不等式约束条件。那么其在极值点满足以下条件:
h(x)=0g(x)≤0μ=0
对比两种情况:
- 情况一:μ=0,g(x)≤0
- 情况二:μ≥0,g(x)=0
综合情况一和情况二,可得到KKT条件为:
⎧⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪⎩gj(x)⩽0(主问题可行)μj⩾0(对偶问题可行)μjgj(x)=0(互补松弛)h(x)=0(3)
拉格朗日乘子法对偶问题
对于如下优化问题:
minxf(x) s.t. hi(x)=0(i=1,…,m)gj(x)⩽0(j=1,…,n)(10)
其拉格朗日函数为:
L(x,λ,μ)=f(x)+m∑i=1λihi(x)+n∑j=1μjgj(x)s.t.μj≥0(4)
对于上述的优化问题(公式10)我们可以等价于(下面的称之为主问题):
minxmaxλ,μL(x,λ,μ) s.t. μi≥0,i=1,2,…,m(5)
证明如下:
minxmaxλ,μL(x,λ,μ)=minx(f(x)+maxλ,μ(m∑i=1μigi(u)+n∑j=1λjhj(u)))=minx(f(x)+{0 若x满足约束∞否则)=minuf(u)(6)
其中, 当gi(x)不满足约束时, 即gi(x)>0, 我们可以令μ=∞, 使得μigi(x)=∞; 当hj(x)不满足约束时, 即 hj(x)≠0, 我们可以取λj=∞, 使得λjhj(x)=∞。当x满足约束时, 由于 μi≥0,gi(x)≤0, 则 μigj(x)≤0,因此我们可以取最大值0。 实际上也就是说如果公式10存在最优解,则最优解必须满足KKT条件。
对于公式10其对偶问题为:
maxλ,μminxL(x,λ,μ) s.t. μi≥0,i=1,2,…,m(7)
对偶问题是主问题的下界(他们两个具有弱对偶性):
p∗=minxmaxλ,μL(x,λ,μ)≥maxλ,μminxL(x,λ,μ)=g∗
你可以记忆成“廋死的骆驼比马大”,还看到一个记忆方法为“宁为凤尾不为鸡头”。hhh
证明如下:
maxxminyf(x,y)≤minymaxxf(x,y)let g(x)=minyf(x,y)then g(x)≤f(x,y),∀y∴maxxg(x)≤maxxf(x,y),∀y∴maxxg(x)≤minymaxxf(x,y)
Slater 条件
前面我们讨论了弱对偶性,这里我们将进行讨论Slater条件,但是为什么我们要讨论Slater条件呢?原因很简单,我们想让上面的弱对偶问题转成强对偶问题。
Slater定理是说,当Slater条件成立且原问题是凸优化问题时,则强对偶性成立。这里有几个名词值得注意:
-
凸优化问题
如果一个优化问题满足如下格式,我们就称该问题为一个凸优化问题:
minf(x)s.tgi(x)≤0,i=1,...,m hi(x)=0,i=1,...,p
其中f(x)是凸函数,不等式约束g(x)也是凸函数,等式约束h(x)是仿射函数。
-
凸函数是具有如下特性的一个定义在某个向量空间的凸子集C(区间)上的实值函数f:对其定义域上任意两点x1,x2总有f(x1+x22)≤f(x1)+f(x2)2。

-
仿射函数
仿射函数,即最高次数为1的多项式函数。
-
强对偶性
弱对偶性是p∗=minxmaxλ,μL(x,λ,μ)≥maxλ,μminxL(x,λ,μ)=g∗,也就是p∗≥g∗,则强对偶性是p∗=g∗。
说了这么多,那什么是Slater条件呢?
- 原问题是凸优化问题
- 存在x使得g(x)≤0严格成立。(换句话说,就是存在x使得g(x)<0成立)
值得注意的是线性支持向量机满足Slater条件(因为12w⊤w和1−yi(wTxi+b)均为凸函数),也就是它满足强对偶性。
最大间隔分类器与拉格朗日乘子法
前面说了这么多,实际上也就是为这个地方做铺垫。我们可以将最大间隔分类问题转化成在KKT条件下的拉格朗日函数的极值问题,然后又因为其满足Slater条件,我们可以转化成强对偶问题。
在最大间隔分类中,我们得到如下结论:
⎧⎨⎩min12∥ω∥2s.t.yi(ωTxi+b)⩾1,i=1,2,...,m(11)
其拉格朗日函数为:
L(w,b,α):=12w⊤w+m∑i=1αi(1−yi(w⊤xi+b))s.t.αi≥0,i=1,2,...,m(8)
其对偶问题(满足强对偶性)为:
maxαminw,b(12w⊤w+m∑i=1αi(1−yi(w⊤xi+b))) s.t. αi≥0,i=1,2,…,m(12)
然后我们来求:
minw,b(12w⊤w+m∑i=1αi(1−yi(w⊤xi+b))) s.t. αi≥0,i=1,2,…,m(9)
上式对于(ω,b)属于无约束优化问题,令偏导为零可得:
∂L∂w=0⇒w=m∑i=1αiyixi∂L∂b=0⇒m∑i=1αiyi=0(13)
代入公式(12)消去(ω,b)可得:
minα12m∑i=1m∑j=1αiαjyiyjx⊤ixj−m∑i=1αi s.t. m∑i=1αiyi=0αi≥0,i=1,2,…,m(14)
因此问题变成了寻找合适的α使得公式(12)成立。
又因为公式(11)在极值点必定满足KKT条件。也就是说αi(1−yi(w⊤xi+b))=0,当αi>0时必有1−yi(w⊤xi+b)=0。因此对于αi>0对应的样本是支持向量,对于非支持向量,则αi=0

对于公式13有:
w=m∑i=1αiyixi=m∑i:αi=00⋅yixi+m∑i:αi>0αiyixi=∑i∈SVαiyixi(SV代表所有支持向量的集合)(10)
然后我们可以求b了,对于支持向量有yk=ω⊤x+b,因此:
b=yk−w⊤x=yk−(∑i∈SVαiyixi)⊤xk=yk−∑i∈SVαiyix⊤ixk(11)
通过上面的推导,我们能够知道支持向量机的(ω,b)仅由支持向量决定。实践中, 为了得到对 $b 更稳健的估计,通常使用对所有支持向量求解得到b$的平均值。
综上,我们想计算出合适的ω和b,就必须计算出αi,然后我们就可以得到支持向量,在然后我们我们通过支持向量和αi就可以计算出ω和b。
至于怎么求αi,我们使用可以使用后面介绍的SMO算法求解,首先我们来介绍一下核方法。
核技巧
在前面的讨论中,我们对样本的考虑都是线性可分的。但是实际上,大部分的情况下,数据都是非线性可分的。比如说异或问题。在前面的章节神经网络中,我们是通过使用增加一层隐层来解决这个问题,那么对于SVM我们应该怎么解决呢?SVM中使用核技巧(kernel trick)来解决非线性问题。

既然在原始的特征空间Rd不是线性可分的,支持向量机希望通过一个映射ϕ:Rd→R~d, 使得数据在新的空间R~d是线性可分的。可以证明(但是我证明不出),当d有限时, 一定存在~d, 使得样本在空间R~d中线性可分。
核函数
令ϕ(x)为x映射后的特征向量,因此划分的超平面可以表示为f(x)=ϕ(x)+b。同时公式(11)可以改为:
minw,b12∥w∥2 s.t. yi(wTϕ(xi)+b)⩾1,i=1,2,…,m(12)
然后公式14可以写成如下的形式:
minα12m∑i=1m∑j=1αiαjyiyjϕ(x⊤i)ϕ(xj)−m∑i=1αi s.t. m∑i=1αiyi=0αi≥0,i=1,2,…,m(15)
求解公式15面临一个很大的问题,那就是ϕ(x⊤i)和ϕ(xj)很难计算(一般来说它们都是高维的甚至无穷维),首先需要计算特征在R~d的映射,然后又要计算在他的内积,复杂度为O(~d)。因此我们通过使用核技巧,将这两步并将复杂度降低到Rd。即核技巧希望构造一个核函数κ(xi,xj),使得:
κ(xi,xj)=ϕ(xi)⊤ϕ(xj)(13)
实际上核函数不仅仅只用于SVM,对于所有涉及到向量内积的运算,我们都可以使用核函数来解决。
因此公式15可以改写成:
minα12m∑i=1m∑j=1αiαjyiyjκ(xi,xj)−m∑i=1αi s.t. m∑i=1αiyi=0αi≥0,i=1,2,…,m(15)
对于核函数来说,我们可以自己造,但是通常我们会从一些常见的核函数中进行选择:根据不同问题选择不同的参数。下图是是一些常见的核函数。

软间隔
前面我们讨论的情况都是超平面都是能够完美的将数据进行分开(即使是非线性数据,我们使用核函数进行骚操作然后进行分割),这种所有样本都满足约束的情况称之为硬间隔(hard margin),但实际上数据是有噪音的,如果使用核函数进行骚操作,然后在找到一个线性可分超平面,可能就会造成模型过拟合,同样也可能我们找不到合适的核函数。因此,我们将标准放宽,允许一定的“错误”,称之为软间隔(soft margin):

我们希望在优化间隔的同时,允许错误样本的出现,但是我们同样希望出现错误的样本越少越好。因此优化目标公式(5)可写成:
⎧⎪
⎪⎨⎪
⎪⎩minw,b(12∥w∥2+Cm∑i=1ℓ0/1(yi(wTxi+b)−1))s.t.yi(ωTxi+b)⩾1,i=1,2,...,m(16)
其中C>0是一个常数,ℓ0/1是“0/1损失函数”。
ℓ0/1(z)={1, if z<00, otherwise (14)
可以很简单的知道,C取无穷大时,公式(16)迫使所有样本均满足约束。当C取有限值时,允许一些样本不满足约束。but,还是有些问题,ℓ0/1是非凸,非连续的一个函数,会使得上式(16)变得不好求解,因此人们通常使用其他的函数来替代ℓ0/1,称之为“替代损失(surrogate loss)”。下面是几种常用的替代损失函数:
hinge 损失:ℓhinge(z)=max(0,1−z) 指数损失(exponential loss): ℓexp(z)=exp(−z) 对率损失(logistic loss): ℓlog(z)=log(1+exp(−z))(15)
对应的图如下:

下面将以hinge函数为例子介绍软间隔支持向量机的推导。
软间隔支持向量机推导
hinge函数:ℓhinge(z)=max(0,1−z)等价于:
ξi={0 if yi(w⊤ϕ(xi)+b)≥11−yi(w⊤ϕ(xi)+b) otherwise (16)
ξi我们称之为松弛变量(slack variable),样本违背约束越远,则松弛变量值越大。因此优化目标式(5)可以写成:
minw,b,ξ(12w⊤w+Cm∑i=1ξi) s.t. yi(w⊤ϕ(xi)+b)≥1−ξi,i=1,2,…,mξi≥0,i=1,2,…,m(17)
同样在这里C越大,代表我们希望越多的样本满足约束。软间隔的拉格朗日函数为:
L(w,b,ξ,α,β):=12w⊤w+Cm∑i=1ξi+m∑i=1αi(1−ξi−yi(w⊤ϕ(xi)+b))+m∑i=1βi(−ξi)(18)
其KKT条件为:
⎧⎪
⎪⎨⎪
⎪⎩1−ξi−yi(w⊤ϕ(xi)+b)≤0,−ξi≤0(主问题可行)αi≥0,βi≥0(对偶问题可行)αi(1−ξi−yi(w⊤ϕ(xi)+b))=0,βiξi=0(互补松弛)(17)
其对偶问题为:
maxα,βminw,b,ξL(w,b,ξ,α,β) s.t. αi≥0,i=1,2,…,mβi≥0,i=1,2,…,m(18)
minw,b,ξL(w,b,ξ,α,β)的优化属于无约束的优化问题,我们通过将偏导置零的方法得到(w,b,ξ)的最优值:
∂L∂w=0⇒w=m∑i=1αiyiϕ(xi)∂L∂b=0⇒m∑i=1αiyi=0∂L∂ξ=0⇒αi+βi=C(19)
因为βi=C−αi≥0,因此我们约束0≤αi≤C,将βi=C−αi,w=∑mi=1αiyiϕ(xi),代入式(18)可得:
minα12∑mi=1∑mj=1αiαjyiyjϕ(xi)⊤ϕ(xj)−∑mi=1αi s.t. ∑mi=1αiyi=0,0≤αi≤C(20)
如果我们将式(17)看成如下一般形式:
minf(Ω(f)+Cm∑i=1ℓ(f(xi),yi))(19)
对于Ω(f)我们称之为“结构风险(structural risk)”,第二项∑mi=1ℓ(f(xi),yi)称之为“经验分享(empirical risk)“,而C的作用就是对两者进行折中。
SMO算法
前面说了这么多,终于终于,我们要开始说SMO(Sequential minimal optimization,序列最小化)算法了。首先说一下这个算法的目的,这个算法就是用来求αi的。SMO算法是一种启发式算法,基本思路是如果所有变量的解都满足最优化问题的KKT条件,则该最优化问题的解就得到了。
对于式(19)如果我们将ϕ(xi)⊤ϕ(xj)使用核函数来表示则有:
minα12N∑i=1N∑j=1αiαjyiyjK(xi,xj)−N∑i=1αi s.t. N∑i=1αiyi=00⩽αi⩽C,i=1,2,⋯,N(21)
假如我们选择α1,α2作为变量(至于为什么不是只选择一个变量是因为存在∑Ni=1αiyi=0这个约束条件),固定其他变量αi(i=3,4,⋯,N),则式(20)问题可以变成:
minα1,α2W(α1,α2)=12K11α21+12K22α22+y1y2K12α1α2−(α1+α2)+y1α1∑Ni=3yiαiKi1+y2α2∑Ni=3yiαiKi2 s.t. α1y1+α2y2=−∑Ni=3yiαi=ς0⩽αi⩽C,i=1,2(22)
在式(21)中省略了∑Ni=3αi这个式子,是因为该式为常数项。
因为α1y1+α2y2=常数,y1=±1,y2=±1,因此有:
{α1−α2=k(y1≠y2)α1+α2=k(y1=y2) s.t. 0⩽α1⩽C,0⩽α2⩽C(23)
我们可以将式(22)用图表示出来:

因为α1和α2存在线性关系,这样两个变量的最优化问题成为了实质上单变量的最优化问题,因此,我们可以看成其为变量α2的最优化问题。
设式(22)的初始可行解为αold 1,αold 2,最优解为αnew 1,αnew2。对于αnewi来说,其取值范围必须满足:
L⩽αnew i⩽H
- 情况1:L=max(0,αold 2−αold 1),H=min(C,C+αold 2−αold 1)
- 情况2:L=max(0,αold 2+αold 1−C),H=min(C,αold 2+αold 1)
设我们计算出来的α2为αnew,unc2,则有:
αnew2=⎧⎪⎨⎪⎩Hαnew,unc2>Hαnew,unc2L≤αnew,unc2≤HLαnew,unc2<L
那么问题就回到了如果我们有αold2我们如何得到αnew,unc2呢?
首先我们设一个超平面函数g(x)如下:
设:g(x)=w∗∙ϕ(x)+b由式(19)可知w=m∑i=1αiyiϕ(xi)因此有:g(x)=m∑j=1α∗jyjK(x,xj)+b∗
然后我们令
Ei=g(xi)−yi=(N∑j=1αjyjK(xj,xi)+b)−yi,i=1,2(20)
同时引进记号:
vi=N∑j=3αjyjK(xi,xj)=g(xi)−2∑j=1αjyjK(xi,xj)−b,i=1,2(21)
因此式(22)可以改写成:
W(α1,α2)=|12K11α21+12K22α22+y1y2K12α1α2−(α1+α2)+y1v1α1+y2v2α2(24)
又因为α1y1+α2y2=ς,yiyi=1,因此α1可以表示为:
α1=(ς−y2α2)y1(22)
代入式(24)中,我们有:
W(α2)=12K11(s−α2y2)2+12K22α22+y2K12(s−α2y2)α2−(s−α2y2)y1−α2+v1(s−α2y2)+y2v2α2(23)
然后,我们对α2求导数:
∂W∂α2=K11α2+K22α2−2K12α2−K11Sy2+K12sy2+y1y2−1−v1y2+y2v2(24)
令其导数为0可得:
(K11+K22−2K12)α2=y2(y2−y1+ςK11−ςK12+v1−v2)=y2[y2−y1+ςK11−ςK12+(g(x1)−2∑j=1yjαjK1j−b)−(g(x2)−2∑j=1yjαjK2j−b)](25)
又因为ς=αold1y1+αold2y2代入式(25)可得:
(K11+K22−2K12)αnew , unc 2=y2((K11+K22−2K12)αold 2y2+y2−y1+g(x1)−g(x2))=(K11+K22−2K12)αold 2+y2(E1−E2)(26)
令:
η=K11+K22−2K12=∥Φ(x1)−Φ(x2)∥2(25)
因此式(26)可化简为:
αnew ,unc2=αold 2+y2(E1−E2)η(27)
同时有:
αnew2=⎧⎪⎨⎪⎩Hαnew,unc2>Hαnew,unc2L≤αnew,unc2≤HLαnew,unc2<L
因为我们已经得到αnew2,根据αnew1和αnew2之间的线性关系,我们可以就可以得到αnew1了。
我们每次完成两个变量的优化之后,都需要重新更新阈值。具体更新可以看下面部分。
SMO变量的选择方法
通过前面部分我们知道SMO算法就是选择两个变量进行优化,其中至少有一个变量是违反了KKT条件(假如没有违反的话,我们也就没必要进行计算了)。我们可以使用α1代表第一个变量,α2代表第二个变量。
-
第一个变量的选择
我们称第一个变量的选择为外层循环,外层循环在训练样本中选择违反KKT条件最严重的样本点。对于KKT条件,我们可以转成以下的形式:
αi=0⇔yig(xi)⩾1(1)0<αi<C⇔yig(xi)=1(2)αi=C⇔yig(xi)⩽1(3)其中g(xi)=N∑j=1αjyjK(xi,xj)+b(28)
证明如下:
对于上式(1):
∵αi=0,αi+βi=C,且在KKT条件βiξi=0∴βi=C,∴ξi=0又∵由KTT条件可知:1−ξi≤yig(xi),αi[yig(xi)−(1−ξi)]=0∴yig(xi)≥1(26)
对于上式(2):
∵0<αi<C,αi+βi=C,且在KKT条件βiξi=0∴0<βi<C,∴ξi=0又∵由KTT条件可知:1−ξi≤yig(xi),αi[yig(xi)−(1−ξi)]=0∴yig(xi)=1−ξi=1(27)
对于上式(3):
∵αi=C,αi+βi=C,且在KKT条件βiξi=0∴βi=0,ξi≥0又∵由KTT条件可知:1−ξi≤yig(xi),αi[yig(xi)−(1−ξi)]=0∴yig(xi)=1−ξi≤1(28)
当然我们也可以给定一定的精度范围ε,此时KKT条件就变成了:
ai=0⇔yig(xi)≥1−ε0<ai<C⇔1−ε≤yig(xi)≤1+εai=C⇔yig(xi)≤1+ε(29)
然后我们通过变形后的KKT条件,获得违背的样本点违背最严重的作为第一个变量就🆗了。那么如何度量这个严重性呢?emm,就看g(xi)距离KKT条件有多远就行了。
-
第二个变量的选择
第二个变量选择的过程称之为内层循环,其标准是希望能够使α2有足够大的变化。由式(27)我们知道:
αnew ,unc2=αold 2+y2(E1−E2)η(30)
也就是说α2的变化量依赖于|E1−E2|,因此我们可以选择式|E1−E2|最大的α2。因为α1已经确定,所以E1也就已经确定,因此我们只需要确定E2即可。如果E1为正,则选取α2使E2最小,如果E1为负,则选取α2使E2最大。
当我们完成两个变量的优化后(优化后的变量),我们就需要来更新阈值b
- 若更新后的0<α1<C由式(28)中的式(2)可知:
N∑i=1αiyiKi1+b=y1(31)
于是有:
bnew1=y1−N∑i=3αiyiKi1−αnew1y1K11−αnew2y2K21(32)
由Ei的定义式Ei=g(xi)−yi=(∑Nj=1αjyjK(xj,xi)+b)−yi,i=1,2,有:
E1=N∑i=3αiyiKi1+αold1y1K11+αold2y2K21+bold−y1(33)
因此则有:
y1−N∑i=3αiyiKi1=−E1+αold 1y1K11+αold 2y2K21+bold (34)
最终:
bnew 1=−E1−y1K11(αnew 1−αold 1)−y2K21(αnew 2−αold 2)+bold (35)
-
同理若0<α2<C,则有
bnew 2=−E2−y1K12(αnew 1−αold 1)−y2K22(αnew 2−αold 2)+bold (36)
-
若αnew1,αnew2同时满足0<αnewi<C,则最终:
bnew=bnew1+bnew22
- 若αnew1,αnew2为0或者C,那么最终:
bnew=bnew1+bnew22
综上:b=⎧⎪
⎪⎨⎪
⎪⎩bnew1,0<α1<Cbnew2,0<α2<C12(bnew1+bnew2), others (37)
更新完α1和α2后我们需要将Ei进行更新,以便后续的αi和b的求解。
E1=N∑i=3αiyiKi1+αnew1y1K11+αnew2y2K21+bnew−y1E2=N∑i=3αiyiKi2+αnew1y1K12+αnew2y2K22+bnew−y2(38)
总结
综上,SVM就介绍了,SVM看起来很简单,就是找到一条合适的线能够比较好的分割数据集。为了数值化“比较好”这个词,我们引出了间隔的概念,然后我们希望这个间隔足够大,并且所有的数据完美的分离在间隔的两边。于是这个问题就变成了在一定条件下的极值问题。然后我们选择使用拉格朗日乘子法去解决这个问题,其中在极值点会满足KKT条件。为了简化求解,我们通过Slater条件将问题转成了对偶问题。面对非线性问题,我们选择使用核技巧去解决,同时为了避免过拟合,我们选择使用软间隔;并最终使用SMO算法取得到合适的解。
说实话,本来只是想稍微的介绍一下SVM以及它的原理,自己其实对SVM也是属于之听过没真正的了解过的情况。听别人说SVM不是很难,但是最后却发现emm,越推感觉数学越奇妙。也许上面的内容看起来并不难,但是它却是由前人耗费无数的日日夜夜最终才得出了答案,也许这就是科学的魅力吧!
下面是参考的内容,其中强烈推荐《统计学习方法第2版》
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下