SMO概念
通过将原始问题转化成其对偶问题,再使用核函数,引入软间隔概念我们可以得到如下的凸二次规划问题:
按照坐标上升的思路,我们首先固定除以外的所有参数,然后在
上求极值。但是这种思路在这里不适用,因为如果固定
以外的所有参数,那么
将不再是变量(可以由其他值推出),因为问题中规定了
所以SMO算法一次选取两个参数和
做优化,固定
和
以外的参数,求解上面的优化问题获得更新后的
和
。这样SMO的主要步骤如下:
SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。它把原始求解m个参数二次规划问题分解成很多个子二次规划问题分别求解,每个子问题只需要求解2个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。
整个SMO算法包括两部分,1)求解两个变量的二次规划问题 2)选择这两个变量的启发式方法
求解
二次规划问题
假如我们固定和
,则我们的目标函数可以写为:
(1)
其中,
并且省略了与
和
无关的常数。而我们现在的约束条件为:
的计算公式
到这里就可以发现,现在的优化目标其实就是一个关于和
的二次函数。二次函数我们就很熟悉了,求极值的话求导看定义域就好。
1)求导
可以看出是一个常数。由等式
两边同时乘以
,注意
,得:
(2)
带回至目标函数消去,这样我们就将得到只关于
的一元函数。
(3)
对求导令其为零得:
由上式中假设求得了的解,带回到(2)式中可求得
的解,分别记为
和
。优化前的解记为
和
,由于剩下的参数都固定,则有
。
(4)
假设SVM的划分超平面为,由核函数我们可以写为
记为预测值与真实值的差。
(5)
由于,因此:
(6)
(7)
把(4)(6)(7)带入下式中:
得到的并没有考虑到
这一约束条件,所以先记为
,将
记为
,则得到未修剪的
的解:
(8)
2)定义域
我们并不能直接用式(8)来跟新,因为还需要考虑定义域。就好比求最值问题,你求导,导函数为0,就能找到最值点了?不是这样的,要时刻考虑定义域!最值点通常要么在极值点处,要么是边界值。如果这个极值点都不在定义域里,我们怎么能直接把它作为最后的结果呢?
所以我们需要看这个问题的定义域,或者说约束问题里的可行域来对通过导数得到的解进行修剪。
在二维平面上,横坐标为,纵坐标为
。
由于和
的可能取值都为+1或-1,则
有如上图的四种情况。
由式(1)我们可以看出是二次项的系数,我们假设
,这样函数为开口向上的凸函数,在定义域内由最小值。1)如果这个极值点在可行域左边,那么我们可以得到这个可行域内二次函数一定在单增,所以此时L应该是那个取最小值的地方。就如大括号的第三种情况。2)如果这个极值点在可行域右边,那么此时可行域内一定单减,所以此时H就是那个取最小值的地方,就是大括号里的第一种情况。
然后根据求出
的新值:
。
若需要通过计算比较边界处的目标函数值,哪个小取哪个。那怎么计算可行域边界上的目标函数值呢?以计算边界H上的值为例,就是把
代入到目标函数的式子中。
启发式选择变量
和
的选择
第一个变量的选择称为外循环,首先遍历整个样本集,选择违反KKT条件的 作为第一个变量,接着依据相关规则选择第二个变量(见下面分析),对这两个变量采用上述方法进行优化。当遍历完整个样本集后,遍历非边界样本集
中违反KKT条件的
作为第一个变量,同样依据相关规则选择第二个变量,对此两个变量进行优化。当遍历完非边界样本集后,再次回到遍历整个样本集中寻找,即在整个样本集与非边界样本集上来回切换,寻找违反KKT条件的
作为第一个变量。直到遍历整个样本集后,没有违反KKT条件
,然后退出。边界上的样本对应的
或
,在优化过程中很难变化,然而非边界样本
会随着对其他变量的优化会有大的变化。
SMO称第二个变量的选择过程为内循环,假设在外循环中找个第一个变量记为,第二个变量的选择希望能使
有较大的变化,由于
是依赖于
,当
为正,选择小的
作为
;当
为负,选择大的
作为
。通常为每个样本的
保存在一个列表中,选择最大的
来近似最大化步长。
有时按照上述的启发式选择第二个变量,不能够使得函数值有足够的下降,这时按下述步骤:首先在非边界集上选择能够使函数值足够下降的样本作为第二个变量,如果非边界集上没有,则在整个样本集上选择第二个变量,如果整个样本集依然不存在,则重新选择第一个变量。
阈值b的计算
参考博客:
思路及推导:https://blog.csdn.net/luoshixian099/article/details/51227754
具体一些需要注意的细节:https://www.cnblogs.com/xxrxxr/p/7538430.html
Python代码实现:https://blog.csdn.net/yeyang911/article/details/46610639