线性支持向量机
上一篇文章对支持向量机的间隔、对偶和KKT条件做了详细推导,但前文的基础是原始问题为线性可分问题,所以对线性不可分训练数据是不适用的,这时需要引入一个新定义:软间隔。
假如训练数据中有一些特异点,也就是分类会出错的样本点,将这些特异点除去后,剩下的大部分样本点组成的集合是线性可分的,训练数据线性可分时所对应的间隔也被称为硬间隔。
线性不可分也就意味着某些样本点不能满足函数间隔大于等于1的约束条件,即位于两条虚线之间;可以对每个样本点引入一个松弛变量,使函数间隔加上这个松弛变量后大于等于1;并且对于每个松弛变量
都会支付一个代价
,所以目标函数和约束条件会变成如下形式:

其中C称为惩罚参数,新的目标函数是想函数间隔尽量大,同时错分的样本点个数尽量小,而C就是调和二者的系数,对于线性不可分的优化问题就变成了凸二次优化问题(原始问题)。
训练数据样本线性不可分时的模型也就成为线性支持向量机,线性支持向量机是包含线性可分支持向量机的,由于现实中的数据集往往是线性不可分的,所以线性支持向量机具有更广的适用性。
将这个原始问题利用拉格朗日乘子法的对偶性转化成对偶问题的形式如下:

SMO算法
原理概要
SMO算法是一种启发式算法,基本思路为:如果所有变量的解满足此最优化问题的KKT条件,那么就得到了最优解,因为KKT条件是该最优化问题的充分必要条件。
否则,需要选择两个变量,并且固定其他变量,只针对这两个变量构建一个最优化问题,这里的两个变量一个是违反KKT条件最严重的那一个,另一个则是由约束条件确定。这样原问题就可以不断划分成若干个子问题,从而提高了整个算法的效率。
为什么选择两个变量而不是一个呢?因为当时拉格朗日函数对b求导时得到了一个等式约束条件,如下:

最优解上下界
对于最优化问题原问题而言,可以利用其约束条件计算出的上下界。如果固定的变量为
,在等式条件的约束下可以化成下面形式,其中k为自己设定的一个常量:

由于的取值范围总是在0至C之间,并且对应
共有4种组合方式,这里归结为两种分别为
,所以可以通过两个式子绘图如下:

由于总是满足不等式约束,所以这个解的取值一定会位于一个范围之中,这里将其下界设为L、上界设为H,这个L和H就是
所在线段端点的界。
当
时,
的上下界如下:


目标函数转化
在处理过约束条件后,下面需要对原始问题的目标函数做一些处理,因为SMO算法的思路首先就是选择两个变量固定剩余变量嘛,所以将目标函数“打开”,相应处理如下:


因为在约束条件中已经确定了只优化,所以目标函数对
求导时只想留下下标为2的
,其余的变量就需要利用常数或者
替换。
这里需要引入一个新的概念:误差
。

目标函数式子中的可以利用
进行替换,如下式:





经过上述约束的修剪,最优解就可以记为了,具体如下:


变量选择
上文提及了SMO算法在每个子问题中都会选择两个变量,“一个变量是违反KKT条件最严重的”,这句话的意思也就是最不满足KKT条件的,下面介绍选择变量的具体操作。
SMO将第一个变量的选择称为外层循环,首先遍历整个样本集,选择违反KKT条件最严重的的样本点,将其对应变量作为第一个变量。具体操作就是检验样本点是否满足KKT条件,如下:


在检验过程中,外层循环首先遍历所有支持向量点(满足第二个条件),检验他们是否满足KKT条件。如果这样样本点都满足KKT条件,那么将遍历整个数据集的样本点,检验他们是否满足KKT条件。直到整个数据集中没有违反KKT条件的点,然后退出。
SMO将第二个变量的选择称为内循环,假设在外层循环中已经找到了第一个变量,现在就要在内层循环中找到第二个变量
,而
选择的标准是希望能使
有足够大的变化,这样的目的是让目标函数迭代优化的函数值收敛速度更快。
通过上面公式推导,我们已知的是是依赖于
的,那么只要使
对应的
最大即可。由于
已确定,所以
也随之确定。如果
是正值,那么选择最小的
作为
;如果
是负值,那么选择最大的
作为
;通常将所有的
存入至一个列表中,在列表中选择最大的
。
内层循环选择的顺序与外层循环一致,先遍历支持向量点,若没有合适的
,则将遍历整个数据集;若仍找不到合适的
,则放弃
,再通过外层循环寻找另外的
。
计算阈值b
每完成对两个变量的优化后,要对b的值进行更新,因为b的值关系到的计算,即关系到下次优化时
的计算。
当时,根据已知的条件可以做以下推导:




若同时满足条件
,此时
。
而如果是0或者C时,则
及其中间的数都符合KKT条件,所以选择两者的中间值作为此时的
。


总结
最后梳理一下文章内涉及的知识点和流程,首先由线性不可分问题引出了软间隔的定义,并构建了新的目标函数和约束条件,并且利用拉格朗日乘子法将原问题转化成对应的对偶问题。
然后在已知最优化问题后开始介绍了SMO算法,将约束条件转化为需要优化的变量的上下界。在处理目标函数时,我们只想留下
这一个变量,所以需要替换元素,这里引入了误差
解决了这个问题,并且在得到最优解后利用上下界进行修剪。
接着介绍了最优化问题中两个变量是如何选择的,最后介绍了阈值b的推导方法,并且在阈值b的基础上得出每次更新的公式。
关注公众号【奶糖猫】获取每篇文章的源码和数据,欢迎各位伙伴和博主交流呀。
