libsvm最新源代码(版本3.21)理解解析(二)

一、回顾

上节,我们介绍到了SMO的总体过程,本节对SMO的三个难点结合代码进行详细分析。

二、SMO算法

(1)设置拉格朗日乘子α=(α[1]...α[i]...α[l])的初始值(一般设为全0),并设置迭代次数计数器k=1。

(2)如果α向量已经收敛(符合KKT达到停止条件),停止循环,返回结果;否则,找出工作集B=(i,j),实际上就是找出所要更新的两个α(α[i],α[j])的下标,另外定义剩下的α的下标标号为N,即N=(1,2...l)\B(\表示去掉B中元素),并定义B所对应的α为,N所对对应的α为

(3)若,解决如下问题:


否则,解决下面问题:


实际上都是关于α的更新方式,至于如何解决这两个问题以及α的详细计算公式会在后面介绍。

4)用新的α[i],α[j]替换原来的α[i],α[j],迭代计数器k=k+1,跳到第二步,继续循环。

三、KKT条件

在上一篇博客说过,上述SMO算法存在三个难点:

(1)如何判断α收敛,即如何停止循环,达到KKT条件。

(2)如何找出工作集B=(i,j),即如何选出两个要更新的α=(α[i],α[j]);

(3)如何更新工作集中的α,即如何更新α[i],α[j]。

下面我们来看如何解决第一个问题。

那么什么是KKT条件呢?

假设我们要解决的是含有等式和不等式约束的最优化问题:

   

其中,p为等式约束条件的数量,q为不等式约束条件的数量。

f(x)在达到最优值(最小值)时必须满足KKT条件,即:


这就是所谓的KKT条件,也就是等式的拉格朗日乘子λ不能为0,不等式(必须是小于号)的拉格朗日乘子μ必须大于0且与不等式g(x)的乘积等于0,同时拉格朗日函数对未知数α的导数等于0(上述2式)

下面,我们看支持向量机的优化问题:

         

上述优化问题经过整理可得:

        

包含两个不等式集合(分别为l个)和一个等式约束集合(l个)。

该优化问题的拉格朗日函数如下:

       

其中,b,λ,ξ均为拉格朗日乘子,从而可得KKT条件为:


即:

       

        其中,

<C时,C-α>0,ξ(C-α)=0,那么ξ=0,又因为λ>=0,所以由14式得:>=0

同理,可得当>0,因为λα=0,所以λ=0,因为ξ>=0,所以由14式得: <=0。

综上所知,得:

       

因为,y取+1或者-1,将15式左右乘以yi,又可以分两种情况,比如>C时,如果=+1,那么=+b>=0;当=-1时,两面乘以,得-=--b>=0,即+b<=0,同理可分析当>0和=+1和-1的情况,最后可得一个关于b的不等式:


实际上,上式就是15式对=+1和-1两种情况的讨论结果。这意味着,满足KKT条件就得满足上式,也就是:


当然,在现实中,我们不这么严密,常采取以下的条件,即:


ε被称为容忍因子。

所以,当我们检测17式就可以当作SMO循环结束的条件,LIBSVM中也是这么做的。

四、工作集的选择

在第三节中,我们讨论了SMO的一个难点就是SMO循环结束的停止条件,接下来我们讨论如何选取工作集B=(i,j),也就是如何选取所要更新的至于原理性的内容,论文Working Set Selection Using Second Order Information for Training Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf)进行了详细介绍,挺难理解的,本人目前也未理解,后续可能对原理性继续进行阐述。本文主要对选择过程进行描述。

工作集B=(i,j)的选择过程如下:

(1)计算

(2)若>0,则=,否则=是自行设置的一个很小的正数。即:


(3)接下来选择i和j,通过选择最大离散对。首先选择i,

   

通过计算,找出集合中使得最大的那个t(t属于),将其值赋给i。

找出i后,根据i值寻找j:

               

上式的意思是在一个集合中计算值,找出使该值最小的t,赋给j,这个t属于的集合满足两个条件:首先t属于集合,同时,还得满足,这里的i为第一步中选出的i。

过程稍微比较绕,但是理解了后就是两步,第一步找出i,然后根据i找出j。

(4)将i和j返回。

五、的更新

在第四节中我们找出了α的标号i和j,也就是工作集i和j,那么接下来就是更新

在开头我们介绍的SMO算法流程中,介绍了α的更新要根据是否大于0来解决两个问题,这两个问题的详细解决过程在论文LIBSVM: A Library for Support Vector Machines(http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.pdf)进行了介绍,本文只讲述结果。

经过论文中的转换和计算,最终的计算公式如下:

   

其中,为旧值,为所对应的样本标签值,时,

因为可能同号也可能异号,所以42式又可以分为两种情况,这里我们拿异号讨论一下,同号可类似。

异号时:

带入42式得:

   

同时,因为还有0<=α<=C的限制。假设,我们将对应的惩罚因子记为对应的惩罚因子记为(上篇博文中我们说过,为了应对不平衡数据,不同符合的α可能采取不同的惩罚因子C),那么综合考虑,α的更新如下:


这个图将α的更新的各种限制分为4个区域。因为(因为SMO更新两个α,其它不变,所有的α满足y1α1+y2α2+...ylαl=常数,即yiαi+yjαj=常数,带入y就可得,减号是因为yi和yj异号),我们拿region I当作例子分析一下:

超过了界限,所以取最大值,由于,所以综上所知,可得:

同样,当处于region II等其它区域时,可类似分析。

这样,α得更新就介绍完毕了,完整伪代码如下:  

if (y[i] != y[j])
{
	double quad_coef = Q_i[i] + Q_j[j] + 2 * Q_i[j];
	if (quad_coef <= 0)quad_coef = TAU;
	double delta = (-G[i] - G[j]) / quad_coef;
	double diff = alpha[i] - alpha[j];
	alpha[i] += delta;
	alpha[j] += delta;
	if (diff > 0)
	{
		if (alpha[j] < 0) // in region III
		{
			alpha[j] = 0;
			alpha[i] = diff;
		}
	}
	else
	{
		if (alpha[i] < 0) // in region IV
		{
			alpha[i] = 0;
			alpha[j] = -diff;
		}
	}
	if (diff > C_i - C_j)
	{
		if (alpha[i] > C_i) // in region I
		{
			alpha[i] = C_i;
			alpha[j] = C_i - diff;
		}
	}
	else
	{
		if (alpha[j] > C_j) // in region II
		{
			alpha[j] = C_j;
			alpha[i] = C_j + diff;
		}
	}
}
If yi = yj, the derivation is the same.

六、总结

本文详细介绍了LIBSVM中SMO算法最重要得三个难点,结合代码的分析将在以后进行介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值