二、SVM----SMO求解

SMO概念

通过将原始问题转化成其对偶问题,再使用核函数,引入软间隔概念我们可以得到如下的凸二次规划问题:

                                                                               \mathop{min} \limits_{\boldsymbol{\boldsymbol{\alpha } } } \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m} \alpha _{i}\alpha _{j}y_{i}y_{j}\boldsymbol{\kappa \left ( x_{i},x_{j} \right )}-\sum_{i=1}^{m}\alpha _{i}

                                                                               s.t.\; \sum_{i=1}^{m}\alpha _{i}y_{i}=0

                                                                                       0\leqslant \alpha _{i}\leqslant C,\; i=1,2,...,m.

按照坐标上升的思路,我们首先固定除\alpha _{1}以外的所有参数,然后在\alpha _{1}上求极值。但是这种思路在这里不适用,因为如果固定\alpha _{1}以外的所有参数,那么\alpha _{1}将不再是变量(可以由其他值推出),因为问题中规定了

                                                                                \alpha _{1}y_{1}=-\sum_{i=2}^{m}\alpha _{i}y_{i}

所以SMO算法一次选取两个参数\alpha _{i}\alpha _{j}做优化,固定\alpha _{i}\alpha _{j}以外的参数,求解上面的优化问题获得更新后的\alpha _{i}\alpha _{j}。这样SMO的主要步骤如下:

clip_image013

SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。它把原始求解m个参数二次规划问题分解成很多个子二次规划问题分别求解,每个子问题只需要求解2个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。

整个SMO算法包括两部分,1)求解两个变量的二次规划问题     2)选择这两个变量的启发式方法

 

求解

二次规划问题

假如我们固定\alpha _{1}\alpha _{2},则我们的目标函数可以写为:

 

                                          min\; \frac{1}{2}K_{11}\alpha _{1}^{2}+\frac{1}{2}K_{22}\alpha _{2}^{2} +y_{1}y_{2}K_{12}\alpha _{1}\alpha _{2} -\left ( \alpha _{1}+\alpha _{2} \right )+y_{1}\nu _{1}\alpha _{1}+y_{2}\nu _{2}\alpha _{2}                (1)

其中K_{ij}=\kappa \left ( x_{i},x_{j} \right )\small \nu _{i}=\sum_{j=3}^{m}\alpha _{j}y_{j}K_{ij},\; i=1,2并且省略了与\alpha _{1}\alpha _{2}无关的常数。而我们现在的约束条件为:

                                       s.t.\; \alpha _{1}y_{1} + \alpha _{2} y_{2}=-\sum_{i=3}^{m} \alpha _{i}y_{i}=\boldsymbol{\zeta}

                                               0\leqslant \alpha _{i}\leqslant C,\; i=1,2,...,m.

\large \boldsymbol{\alpha _{2}}的计算公式

到这里就可以发现,现在的优化目标其实就是一个关于\alpha _{1}\alpha _{2}的二次函数。二次函数我们就很熟悉了,求极值的话求导定义域就好。

1)求导

可以看出\boldsymbol{\zeta }是一个常数。由等式\alpha _{1}y_{1} + \alpha _{2} y_{2}=\boldsymbol{\zeta}两边同时乘以y_{1},注意y_{i}^{2}=1,得:

                                                                       \large \alpha _{1}=y_{1}\left ( \boldsymbol{\zeta }-y_{2}\alpha _{2} \right )                         (2)

带回至目标函数消去\alpha _{1},这样我们就将得到只关于\alpha _{2}的一元函数。

                                min\Psi \left ( \alpha _{2} \right )=min\; \frac{1}{2}K_{11}\left ( \boldsymbol{\zeta }-\alpha _{2}y_{2} \right )^{2} +\frac{1}{2}K_{22}\alpha _{2}^{2} +y_{2}K_{12}\left ( \boldsymbol{\zeta }-\alpha _{2}y_{2} \right )\alpha _{2}

                                                       -\left ( \boldsymbol{\zeta }-\alpha _{2}y_{2} \right )y_{1} -\alpha _{2}+\nu _{1}\left ( \boldsymbol{\zeta }-\alpha _{2}y_{2} \right ) +y_{2}\nu _{2}\alpha _{2}                                         (3)

\alpha _{2}求导令其为零得:

                              \small \frac{\partial \Psi \left ( \alpha _{2} \right )}{\partial \alpha _{2}}\left ( K_{11}+K_{22}-2K_{12} \right )\alpha _{2}-K_{11}\boldsymbol{\zeta }y_{2}+K_{12}\boldsymbol{\zeta }y_{2}+y_{1}y_{2}-1-\nu _{1}y_{2}+\nu _{2}y_{2}=0

由上式中假设求得了\alpha _{2}的解,带回到(2)式中可求得\alpha _{1}的解,分别记为\alpha _{1}^{new}\alpha _{2}^{new}。优化前的解记为\alpha _{1}^{old}\alpha _{2}^{old},由于剩下的参数都固定,则有\alpha _{1}^{old}y_{1}+\alpha _{2}^{old}y_{2}=\alpha _{1}^{new}y_{1}+\alpha _{2}^{new}y_{2}=\boldsymbol{\zeta }

                                                                       \alpha _{1}^{new}y_{1}+\alpha _{2}^{new}y_{2}=\boldsymbol{\zeta }                    (4)

假设SVM的划分超平面为f\left ( x \right )=w^{T}x+b,由核函数我们可以写为

                                                                     f\left ( x \right )=\sum_{i=1}^{m}\alpha _{i}y_{i}\kappa \left ( \boldsymbol{x,x_{i}} \right )+b

E_{i}为预测值与真实值的差。E_{i}=f\left ( x_{i} \right )-y_{i}           (5)

由于\nu _{i}=\sum_{j=3}^{m}\alpha _{j}y_{j}K_{ij},\; i=1,2,因此:

                                                                      \nu _{1}=f\left ( x_{1} \right )-\sum_{j=1}^{2}y_{i}\alpha _{i}K_{1j}-b             (6)       

                                                                      \nu _{2}=f\left ( x_{2} \right )-\sum_{j=1}^{2}y_{i}\alpha _{i}K_{2j}-b             (7)

把(4)(6)(7)带入下式中:

                              \left ( K_{11}+K_{22}-2K_{12} \right )\alpha _{2}-K_{11}\boldsymbol{\zeta }y_{2}+K_{12}\boldsymbol{\zeta }y_{2}+y_{1}y_{2}-1-\nu _{1}y_{2}+\nu _{2}y_{2}=0

得到的\alpha _{2}并没有考虑到0\leqslant \alpha _{i}\leqslant C,\; i=1,2,...,m.这一约束条件,所以先记为\alpha _{2}^{new,unclipped},将\left ( K_{11}+K_{22}-2K_{12} \right )记为\eta,则得到未修剪的\alpha _{2}的解:

                                                                  \alpha _{2}^{new,unclipped}=\alpha _{2}^{old}+\frac{y_{2}\left ( E_{1}-E_{2} \right )}{\eta }     (8)

2)定义域

我们并不能直接用式(8)来跟新\alpha _{2},因为还需要考虑定义域。就好比求最值问题,你求导,导函数为0,就能找到最值点了?不是这样的,要时刻考虑定义域!最值点通常要么在极值点处,要么是边界值。如果这个极值点都不在定义域里,我们怎么能直接把它作为最后的结果呢?

所以我们需要看这个问题的定义域,或者说约束问题里的可行域来对通过导数得到的解进行修剪

  • 0\leqslant \alpha _{i}\leqslant C,\; i=1,2
  • \alpha _{1}y_{1} + \alpha _{2} y_{2}=\boldsymbol{\zeta}

在二维平面上,横坐标为\alpha _{1},纵坐标为\alpha _{2}

这里写图片描述

由于y_{1}y_{2}的可能取值都为+1或-1,则\alpha _{1}y_{1} + \alpha _{2} y_{2}=\boldsymbol{\zeta}有如上图的四种情况。

由式(1)我们可以看出\left ( K_{11}+K_{22}-2K_{12} \right )是二次项的系数,我们假设\left ( K_{11}+K_{22}-2K_{12} \right )> 0,这样函数为开口向上的凸函数,在定义域内由最小值。1)如果这个极值点在可行域左边,那么我们可以得到这个可行域内二次函数一定在单增,所以此时L应该是那个取最小值的地方。就如大括号的第三种情况。2)如果这个极值点在可行域右边,那么此时可行域内一定单减,所以此时H就是那个取最小值的地方,就是大括号里的第一种情况。

然后根据\alpha _{1}^{old}y_{1}+\alpha _{2}^{old}y_{2}=\alpha _{1}^{new}y_{1}+\alpha _{2}^{new}y_{2}=\boldsymbol{\zeta }求出\alpha _{1}的新值:\alpha _{1}^{new}=\alpha _{1}^{old}+y_{1}y_{2}\left (\alpha _{1}^{old}- \alpha _{1}^{new} \right )

\left ( K_{11}+K_{22}-2K_{12} \right )\leqslant 0需要通过计算比较边界处的目标函数值,哪个小取哪个。那怎么计算可行域边界上的目标函数值呢?以计算边界H上的值为例,就是把\alpha _{2}=H代入到目标函数的式子中。

 

启发式选择变量

\small \boldsymbol{\alpha _{i}}\small \boldsymbol{\alpha _{j}}的选择

 

第一个变量的选择称为外循环,首先遍历整个样本集,选择违反KKT条件的 \small \alpha _{i}作为第一个变量,接着依据相关规则选择第二个变量(见下面分析),对这两个变量采用上述方法进行优化。当遍历完整个样本集后,遍历非边界样本集\small (0< \alpha _{i}< C)中违反KKT条件的\small \alpha _{i}作为第一个变量,同样依据相关规则选择第二个变量,对此两个变量进行优化。当遍历完非边界样本集后,再次回到遍历整个样本集中寻找,即在整个样本集与非边界样本集上来回切换,寻找违反KKT条件的 \small \alpha _{i}作为第一个变量。直到遍历整个样本集后,没有违反KKT条件\small \alpha _{i},然后退出。边界上的样本对应的\small \alpha _{i}=0\small \alpha _{i}=C,在优化过程中很难变化,然而非边界样本\small 0< \alpha _{i}< C会随着对其他变量的优化会有大的变化。

SMO称第二个变量的选择过程为内循环,假设在外循环中找个第一个变量记为\small \alpha _{1},第二个变量的选择希望能使 \small \alpha _{2}有较大的变化,由于\small \alpha _{2}是依赖于\small \left | E_{1}-E_{2} \right |,当\small E_{1}为正,选择小的\small E_{i}作为\small E_{2};当\small E_{1}为负,选择大的\small E_{i}作为\small E_{2}。通常为每个样本的\small E_{i}保存在一个列表中,选择最大的\small \left | E_{1}-E_{2} \right |来近似最大化步长。

有时按照上述的启发式选择第二个变量,不能够使得函数值有足够的下降,这时按下述步骤:首先在非边界集上选择能够使函数值足够下降的样本作为第二个变量,如果非边界集上没有,则在整个样本集上选择第二个变量,如果整个样本集依然不存在,则重新选择第一个变量。

阈值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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值