前两节我们一直在介绍svm的原理,优化目标函数,并且已经推导出了最后的目标函数,现在终于要求解这个问题了并得到模型,在上一节《从零开始学习SVM(二)—松弛变量》中我们介绍了松弛变量的的概念,推导出了加入松弛变量后的目标函数并且后面将会一直使用这个目标函数:
maxα∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxTixj(1)
s.t.∑i=1mαiyi=0(1.1)
C⩾αi⩾0,i=1,2,…,m
KKT条件:
αi⩾0
yif(xi)−1+ζi⩾0
αi(yif(xi)−1+ζi)=0
ζi⩾0,uiζi=0
有了优化目标之后,我们终于到了介绍如何求出最优解的部分:SMO算法。当然解决办法有很多中,在笔者查看了众多资料后大多数就是推荐使用SMO(Sequential Minimal Optimization;序列最小优化)算法,这种算法高效,求解时间短。
还记得我们的模型公式吗?
f(x)=wTx+b
也就是说我们求解出来w与b这个模型就算得到了,还记得在第一节中我们在得到最初的目标函数的对偶函数时候, 我们得到了
w的另一种表示方式
⅁L(w,b,a)⅁w=w−∑i=1mαiyixi=0
代入模型函数
f(x)=∑i,jmαiyi(xi)Txj+b(2)
也就是说我们只要求解出每个样本对应的拉格朗日乘子
αi就能求出模型。可是这
αi={
α1,α2,…,αm}这参数也太多了,但是别忘了我们求出了优化目标函数的对偶函数函数(1),但是这仍然要求很多参数啊,别急我们先介绍一个优化目标的思路。就拿最近比较火的游戏《荒野求生》又叫吃鸡的游戏来说吧,在游戏过程中经常会在一段时间后刷圈,只有在圈内我们才能苟活,每刷一次我们就得往圈内跑,可是怎么跑呢?各路都有人,我们是直直的跑(一般这样会很快gg),还是绕开各路人马,让他们厮杀我们坐收渔翁之利?我们想要安全的到达圈内当然是绕着跑啦。这与我们的求解思路是不是很一直?我们想要求解出参数,想要直奔目标直接对目标函数求解肯定很费事,我敢说你很快就会gg,但是如果我们绕开这个目标函数最优解,而是通过先优化其中的两个,其他的不管,然后循环这样操作,直到所有的参数
αi都满足KKT条件是不是也可以达到我们的目标呢?当然是啦,看下图,红线代表直奔目标,这样是很快,但是很容易gg啊,还是蓝线我们一点一点的达到目标,我们先达到一个方向的最优,先按照一个方向固定其他方式,当所有方向都达到最优我们也达到了我们目标

同理,SMO算法就是让我们先固定其中的两个参数
α1,α2其他的不管,然后依次随机的抽取两个
α对,知道所有的
α都满足KKT条件,那么不就得到了我们优化目标了吗?
为什么要固定两个呢?一个,两个,三个,四个不行吗?
还记得我们之前得到的一个kkt条件吗?就是上面的(1.1)约束条件:
∑i=1mαiyi=0
没错就是它,因为我们要满足这个条件,所以我们只改变其中的一个
αi肯定不行啊,因为这样还会等于0吗?那么这么说3个4个也可以啊,是可以啊,但是2个不是简单嘛!!也就是说
α1y1+α2y2+∑i=3mαiyi=0
α1y1+α2y2=−∑i=3mαiyi
令:
α1y1+α2y2=ϵ
无论你怎么改变
α1,α2反正和为常量。设更新后的
α分别为
αnew1,αnew2,所以
α1y1+α2y2=αnew1y1+αnew2y2=ϵ(3)
可是哪些
α需要被该变呢?有什么标准呢?当然是KKT条件啦,只要满足约束就是好的,不满足则需要改变进行优化。还记得这个约束条件吗?
s.t.yi(wTxi+b)⩾1,i=1,2,3…,m.
也就是
yif(xi)⩾1 与(1.1)约束,首先找到满足约束的
α,我们可知:
αi=0,yif(xi)>1表示被正确分类到两个边界线之外
0⩽αi⩽C,yif(xi)=1表示在两个边界之上,属于支持向量
αi=C,yif(xi)<1表示在两个边界之内
以上都是满足约束的,除了这些其他的都是不满足约束的,也就是需要优化的。
由公式(3),我们假设
y1与y2异号,即
α1−α2=ϵ 因为
0<α1,α2<C;α2=α1−ϵ则:
−ϵ<α2<C−ϵ因为
0<α2<C这个条件,所以我们取两者的交集,即:
max(0,−ϵ)<α2<min(C,C−ϵ)
同理可得:
max(0,ϵ)<α2<min(C,C+ϵ)

黄色区域是满足约束的区域,不仅要在黄色区域内,并且还得在
α1−α2=ϵ这条直线上。如果两者是同号的同理可得:

我为了简化公式,把
α1用
α2表示
α1y1+α2y2=−∑i=3mαiyi=ϵ
两边同乘以
y1α1+y1y2α2=−y1∑i=3mαiyi=−y1ϵ
α1=−y1∑i=3mαiyi−y1y2α2
我们把
a1带入原目标函数使得原目标函数只带有
α2(很多人到了这里就贴其他地方弄来的结果,也没有具体推到,直接看到结果我也很茫然,索性自己推导一遍):
∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxTixj
可得:
α1+α2+∑i=3mαi−12α1α1y1y1K(x1,x1)−12α1α2y1y2K(x1,x2)−12α2α1y2y1K(x2,x1)−12α2α2y2y2K(x2,x2)
−12α1y1∑j=3myjαjK(x1,xj)−12α2y2∑j=3myjαjK(x2,xj)−12α1y1∑i=3myiαjK(xi,x1)
−12α2y2∑i=3myiαjK(xi,x2)−12∑i=3m∑j=3mαiαjyiyjK(xi,xj)
令:
∑i=3mαi−12∑i=3m∑j=3mαiαjyiyjK(xi,xj)=Const(常量)
Q=−y1∑i=3mαiyi;y1y2α2=Wα2
α1=Q−Wα2
V1=∑j=3myjαjK(x1,xj)
V2=∑j=3myjαjK(x2,xj)
整理可得:
α1+α2−12α1α1K(x1,x1)−α1α2WK(x1,x2)−12α2α2K(x2,x2)−
α1y1V1−α2y2V2−Const
带入
a1可得:
(Q−Wα2)+α2−12(Q−Wα2)2K(x1,x1)−α2(Q−Wα2)WK(x2,x1)−
12α2α2K(x2,x2)−(Q−Wα2)y1V1−α2y2V2−Const
其中K(x,y)代表x与y的内积。
对
α2进行求导:
①1−W+(Q−Wα2)Wk(x1,x1)−
(Q−2Wα2)WK(x1,x2)−α2K(x2,x2)+y2V1−y2V2
②1−W+WQ(K(x1,x1)−K(x1,x2))−α2(2K(x1,x2)−K(x1,x1)−K(x2,x2)))+y2(V1−V2)
③1−W+y2(V1−V2)+WQ(K(x1,x1)−K(x1,x2))=α2(2K(x1,x2)−K(x1,x1)−K(x2,x2)))
这时候我们就求到了一般形式,我们继续简化公式:
f(xi)=wTxi+b
把w换为之前对目标函数求偏导获取的值:
f(xi)=∑jmαjyjK(xi,xj)+b
所以:
Vi=∑j=3myjαjK(xi,xj)=f(xi)−∑j=12yjαjK(xi,xj)−b
带入上式可得:
1−W+y2(f(x1)−f(x2)−∑j=12yjαjK(x1,xj)+∑j=12yjαjK(x2,xj))+WQ(K(x1,x1)−K(x1,x2))
=α2(2K(x1,x2)−K(x1,x1)−K(x2,x2)))
这个整体为:
−∑j=12yjαjK(x1,xj)+∑j=12yjαjK(x2,xj)=
y2α2K(x2,x2)−y1α1K(x1,x1)
步步为营,接着我们替换Q:
αnew1+Wαnew2=α1+Wα2=−y1∑i=3mαiyi=Q
心好累,终于到了更新
αnew2的一步了
①αnew2(2K(x1,x2)−K(x1,x1)−K(x2,x2)))=
α2(2K(x1,x2)−K(x1,x1)−K(x2,x2)))+y2(f(x1)−f(x2)+y2−y1)
②αnew2=α2+y2(f(x1)−y1−f(x2)+y2)(2K(x1,x2)−K(x1,x1)−K(x2,x2)))
③αnew2=α2+y2(E1−E2)η
结合上面的
α的取值范围:
0<αnew2<C可得:
那我们b如何更新呢?因为在更新α之后,那么标签yi应该与f(xi)值相等(x_i是支持向量):
①yi=f(xi)=∑j=12yjαjK(xi,xj)+bi
经过移项后得到:
②yi−∑j=32yjαjK(xi,xj)−y1αnew1K(xi,x1)−y2αnew2K(xi,x2)=bnewi
结合
Ei:
Ei=f(xi)−yi=
y1α1K(xi,x1)+y2α2K(xi,x2)+∑j=32yjαjK(xi,xj)+bi−yi
猛然发现两个有共同项
yi−∑2j=3yjαjK(xi,xj)啊!那我们联立两个方程好了:
bnewi=−Ei+bi+y1α1K(xi,x1)+y2α2K(xi,x2)
−y1αnew1K(xi,x1)−y2αnew2K(xi,x2)
但是我们取哪个b呢?当然是哪个
αi在(0,C)区间内取哪个,因为符合这个要求的点才是“支持向量”啊,不符合我们当然就不要,但是如何碰巧都在区间内呢?那我们就折中取b1与b2的平均值。
亲爱的读者如果你能看到这,我真心的感谢你对我的支持与认可,如果有任何疑问欢迎交流提问。我真的很想把代码也写上去,这样更容易理解上述过程,当时篇幅过大,使用****的markdown编辑器很烦,每写一句话都会重新解析,偶尔会使得浏览器死掉难以继续写下去。到此我们的线性分类就结束了,后面会推出线性分类实例与线性不可分的介绍,欢迎关注我的微信公共号