上篇文章只是简要介绍了一下SMO算法的核心思想,然而要完全实现这个算法, 步骤是很繁琐的,本文就尝试为大家详细介绍SMO算法。
首先我们将软间隔的SVM模型拿过来:
请牢记,这里的 是超出间隔带的距离,不理解的话请参考上一篇文章。
然后,我们再把由此构造的拉格朗日函数以及KKT条件拿过来:
我们知道,最优解必须满足这些条件。
下一步,我们把在一定程度上求解后的优化模型拿过来:
这里与之前的发生了一点小小的变化,那就是目标函数里两项改变了位置,同时目标方向从最大改成了最小。
在这三个模型的基础上,我们来介绍SMO算法的具体过程。
一、变量选取
上篇文章说到,在SMO算法中,我们一次至少要选取两个变量。为了简单起见,我们就只选取两个变量。那么选取哪两个变量呢?上面提到,由SVM构造的最优解必然满足KKT条件。而我们在通过 迭代构造超平面的时候,必然会存在一些数据样本不满足KKT条件,此时我们就要修改其对应的
,使其满足KKT条件。所以答案就很明显了,我们要选择的就是不满足KKT条件的数据样本所对应的
。
那么问题来了,我们如何判断数据样本是否满足KKT条件呢?为此,我们需要知道,对于一个样本 ,其满足KKT条件时,相应的
的取值是怎样。
1. 如果 在间隔带外:那么我们有
,根据KKT条件可知
2. 如果 在间隔带内:那么我们有
,根据
可知
3. 如果 在间隔带上:那么我们有
,又根据
可知
相应地,不满足KKT条件的情况我们也就找到了:
1. ,但是
2. ,但是
3. ,但是
或
假设我们现在找到了两个这样的变量 , 接下来我们要求得其新的值。不过,在求新值之前,我们先计算一下它们的取值范围。
二、取值范围
不妨令 当前的值为
, 新值为
, 我们有
分为两种情况:
1. , 此时有
,由于
, 因此
当 时,
取得最大值
, 由于
本身就有一个最大值
, 因此
的上界
当 时,
取得最小值
, 由于
本身就有一个最小值
, 因此
的下界
2. , 此时有
,由于
, 因此
当 时,
取得最小值
, 由于
本身就有一个最小值
, 因此
的下界
当 时,
取得最大值
, 由于
本身就有一个最大值
, 因此
的上界
到这里,我们就求得了不同情况下 的取值范围。虽然这只是
的取值范围,但是由于
的存在,
的取值范围也就相应确定了。
接下来我们要做的就是求出 ,然后与这个范围进行比较。
三、变量求解
回到原问题来, 我们的目标函数是: , 现在我们尝试着将其展开,展开的原则是将含有
的项单独提出来。我们先令
表示
两个向量的内积,那么,展开式可以写成如下形式:
其中, 。 这里的
是有其含义的。 注意到
,
其中 是对第
个数据的预测值。 所以
是预测值减去某个数。
接下来,我们将 用
表示,然后代入上式。
与
的关系很上一篇文章中提到过,这里直接拿过来:
, 其中
我们可以求得 对
的导数:
接下来的工作就很简单了,
求上面的展开式的一阶导数,得到:
再求二阶导数,得到:
如果 , 那么展开式是凸函数,在一阶导数等于0的时候取得最小值,即:
对于上式,我们再将 代入其中(注意这里
中的
都是
的,而上式左边我们要求的
是
的最优解,即
,同时注意到
, 于是,上式可进一步变为
进一步,令 , 即预测值与真实值之差,
,我们得到求
的公式:
还记得我们之前求到的 的取值范围吗?此处就派上用场了。我们要将这个值与
的取值范围进行比较,具体地:
其实更严谨地说, 的取值情况要视其单调性而定。此处假定了
, 对于
的情况,最优解在边界取得。具体可以参见http://blog.csdn.net/luoshixian099/article/details/51227754。这里就不再赘述了。
接下来, 可用公式
求出来。
现在我们求到了 ,可以根据这两个新的变量求到两个新的
,那么问题又来了,我们该选择哪一个
呢?一个很直观的逻辑是选择使得超平面最准确的那一个。那么怎样判断准不准呢?显然,由支持向量构造出来的超平面是最准确的,因此,选择的标准就出来了:
此处, 的计算也有技巧。 如果
,那么根据KKT条件,
其中,
所以,
同理,
到此为止,我们所有的求解就完成了。最后就是不断重复这样的过程。所以,再给大家介绍一下SMO算法的步骤。
四、算法步骤
1. 选取要更新的变量 ,选取的原则是不满足KKT条件。
2. 计算其中一个变量的上下界,根据公式:
以及其上下界
求出新解
3. 根据公式
求解另一个变量
4. 根据公式
求
5. 重复上述过程直到满足算法停止条件。