机器学习之四:支持向量机——SMO算法

上篇文章只是简要介绍了一下SMO算法的核心思想,然而要完全实现这个算法, 步骤是很繁琐的,本文就尝试为大家详细介绍SMO算法。

首先我们将软间隔的SVM模型拿过来:

\large min\quad \frac{1}{2} {\left \| \mathbf{w} \right \|}^{2} + C\sum_{i=1}^{m}\xi_{i}

\large s.t. \quad 1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b })-\xi_{i}\leq 0,\quad i=1,...,m

           \large \xi_{i}\geq 0

请牢记,这里的 \large \xi_{i} 是超出间隔带的距离,不理解的话请参考上一篇文章。

然后,我们再把由此构造的拉格朗日函数以及KKT条件拿过来:

\underset{\textbf{w},b,\xi}{min}\underset{\lambda,\mu}{max}L(w,b,\xi,\lambda,\mu) =\frac{1}{2} {\left \| \mathbf{w} \right \|}^{2}+C\sum_{i=1}^{m}\xi_{i}+\sum_{i=1}^{m}\lambda_{i}h_{i}(x)-\sum_{i=1}^{m}\mu_{i}\xi_{i}

s.t. \quad h_{i}(x) =1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b })-\xi_{i},\quad i=1,..,m

          \lambda_{i}\geq 0

          \mu_{i}\geq 0

          \lambda_{j}h_{j}(x) = 0 \quad j=1,...,n

          \mu_{j}\xi_{i}= 0

我们知道,最优解必须满足这些条件。

下一步,我们把在一定程度上求解后的优化模型拿过来:

\underset{\lambda}{min}[\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}x_{i}x_{j}y_{i}y_{j}-\sum_{j=1}^{m}\lambda_{i}]

s.t. \quad\sum_{i=1}^{m}\lambda_{i}y_{i}=0

          \lambda_{i}\geq 0,\quad i=1,...,m

          C = \lambda_{i}+\mu_{i}

这里与之前的发生了一点小小的变化,那就是目标函数里两项改变了位置,同时目标方向从最大改成了最小。

在这三个模型的基础上,我们来介绍SMO算法的具体过程。

一、变量选取

上篇文章说到,在SMO算法中,我们一次至少要选取两个变量。为了简单起见,我们就只选取两个变量。那么选取哪两个变量呢?上面提到,由SVM构造的最优解必然满足KKT条件。而我们在通过 \large \lambda_{i} 迭代构造超平面的时候,必然会存在一些数据样本不满足KKT条件,此时我们就要修改其对应的 \large \lambda_{i} ,使其满足KKT条件。所以答案就很明显了,我们要选择的就是不满足KKT条件的数据样本所对应的 \large \lambda_{i} 。

那么问题来了,我们如何判断数据样本是否满足KKT条件呢?为此,我们需要知道,对于一个样本 \large x_{i} ,其满足KKT条件时,相应的 \large \lambda_{i} 的取值是怎样。

1. 如果 \large x_{i} 在间隔带外:那么我们有 \large \xi_{i}=0,1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )< 0\Rightarrow h_{i}(x)<0,根据KKT条件可知 \large \lambda_{i}= 0

2. 如果 \large x_{i} 在间隔带内:那么我们有 \large \xi_{i}>0,1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )> 0\Rightarrow \mu_{i}=0 ,根据 C = \lambda_{i}+\mu_{i} 可知 \large \lambda_{i}= C

3. 如果 \large x_{i} 在间隔带上:那么我们有 \large \xi_{i}=0,1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )= 0\Rightarrow h_{i}(x)=0,\mu_{i}>0\Rightarrow \lambda_{i}>0 ,又根据 C = \lambda_{i}+\mu_{i} 可知 \large 0<\lambda_{i}< C

相应地,不满足KKT条件的情况我们也就找到了:

1.  \large 1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )< 0 ,但是 \large \lambda_{i}> 0

2.  \large 1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )> 0 ,但是 \large \lambda_{i}< C

3.  \large 1-y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )= 0,但是 \large \lambda_{i}= C 或 \large 0

假设我们现在找到了两个这样的变量 \large \lambda_{1},\lambda_{2} , 接下来我们要求得其新的值。不过,在求新值之前,我们先计算一下它们的取值范围。

二、取值范围

不妨令 \large \lambda_{1},\lambda_{2} 当前的值为 \large \lambda_{1}^{old},\lambda_{2}^{old} , 新值为 \large \lambda_{1}^{new},\lambda_{2}^{new } , 我们有 \large \lambda_{1}^{new}y_{1}+\lambda_{2}^{new}y_{2}=\lambda_{1}^{old}y_{1}+\lambda_{2}^{old}y_{2}=\sum_{i=3}^{m}\lambda_{i}y_{i}

分为两种情况:

1. \large y_{1} = y_{2} , 此时有 \large \lambda_{1}^{new}+\lambda_{2}^{new}=\lambda_{1}^{old}+\lambda_{2}^{old} \Rightarrow \lambda_{2}^{new}=\lambda_{1}^{old}+\lambda_{2}^{old}-\lambda_{1}^{new} ,由于 \large \large 0\leq \lambda_{1}^{new}\leq C , 因此

    当 \large \lambda_{1}^{new}=0 时,\large \lambda_{2}^{new } 取得最大值 \large \lambda_{1}^{old}+\lambda_{2}^{old} , 由于 \large \lambda_{2}^{new } 本身就有一个最大值 \large C , 因此 \large \lambda_{2}^{new } 的上界 \large H = min(C,\lambda_{1}^{old}+\lambda_{2}^{old})

    当 \large \lambda_{1}^{new}=C 时,\large \lambda_{2}^{new } 取得最小值 \large \lambda_{1}^{old}+\lambda_{2}^{old}-C , 由于 \large \lambda_{2}^{new } 本身就有一个最小值 \large 0 , 因此 \large \lambda_{2}^{new } 的下界 \large L = max(0,\lambda_{1}^{old}+\lambda_{2}^{old}-C)

2. \large y_{1} \neq y_{2} , 此时有 \large \lambda_{1}^{new}-\lambda_{2}^{new}=\lambda_{1}^{old}-\lambda_{2}^{old} \Rightarrow \lambda_{2}^{new}=\lambda_{2}^{old}-\lambda_{1}^{old}+\lambda_{1}^{new} ,由于 \large \large 0\leq \lambda_{1}^{new}\leq C , 因此

    当 \large \lambda_{1}^{new}=0 时,\large \lambda_{2}^{new } 取得最小值 \large \lambda_{2}^{old}-\lambda_{1}^{old} , 由于 \large \lambda_{2}^{new } 本身就有一个最小值 \large 0 , 因此 \large \lambda_{2}^{new } 的下界 \large L = max(C,\lambda_{2}^{old}-\lambda_{1}^{old})

    当 \large \lambda_{1}^{new}=C 时,\large \lambda_{2}^{new } 取得最大值 \large \lambda_{2}^{old}-\lambda_{1}^{old} +C , 由于 \large \lambda_{2}^{new } 本身就有一个最大值 \large C , 因此 \large \lambda_{2}^{new } 的上界 \large \large H = min (C,\lambda_{2}^{old}-\lambda_{1}^{old}+C)

到这里,我们就求得了不同情况下 \large \lambda_{2}^{new } 的取值范围。虽然这只是 \large \lambda_{2}^{new }  的取值范围,但是由于 \large \lambda_{1}^{new}+\lambda_{2}^{new}=\lambda_{1}^{old}+\lambda_{2}^{old} 的存在,\large \lambda_{1}^{new } 的取值范围也就相应确定了。

接下来我们要做的就是求出 \large \lambda_{2}^{new },然后与这个范围进行比较。

三、变量求解

回到原问题来, 我们的目标函数是:\large \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}x_{i}x_{j}y_{i}y_{j}-\sum_{j=1}^{m}\lambda_{i} , 现在我们尝试着将其展开,展开的原则是将含有 \large \lambda_{1},\lambda_{2} 的项单独提出来。我们先令 \large K_{ij} 表示 \large x_{i},x_{j} 两个向量的内积,那么,展开式可以写成如下形式:

\large \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\lambda_{i}\lambda_{j}x_{i}x_{j}y_{i}y_{j}-\sum_{j=1}^{m}\lambda_{i} \\\\ =\frac{1}{2} K_{11}\lambda_{1}^{2}+\frac{1}{2} K_{22}\lambda_{2}^{2}+y_{1}y_{2}K_{12}\lambda_{1}\lambda_{2}+y_{1}\lambda_{1}v_{1}+y_{2}\lambda_{2}v_{2} \\\\ - \lambda_{1}-\lambda_{2}- \sum_{i=3}^{m}\sum_{j=3}^{m}\lambda_{i}\lambda_{j}x_{i}x_{j}y_{i}y_{j}

其中, \large v_{i} = \sum_{j=3}^{m}\lambda_{j}y_{j}K_{ij} 。  这里的 \large v_{i} 是有其含义的。 注意到

 \large \sum_{j=3}^{m}\lambda_{j}y_{j}K_{ij} = x_{i}\sum_{j=1}^{m}\lambda_{j}y_{j}x_{j}-\lambda_{1}y_{1}K_{i1}-\lambda_{2}y_{2}K_{i2}\\\\ =\textbf{w}^{T}\textbf{x} = u_{i}-b-\lambda_{1}y_{1}K_{i1}-\lambda_{2}y_{2}K_{i2} ,

其中 \large u_{i} 是对第 \large i 个数据的预测值。 所以 \large v_{i} 是预测值减去某个数。

接下来,我们将 \large \lambda_{1} 用 \large \lambda_{2} 表示,然后代入上式。 \large \lambda_{1} 与 \large \lambda_{2} 的关系很上一篇文章中提到过,这里直接拿过来:\large \lambda_{1} = \frac{A-\lambda_{2}y_{2}}{y_{1}} , 其中 \large A=\lambda_{1}y_{1} + \lambda_{2}y_{2}

我们可以求得  \large \lambda_{1} 对 \large \lambda_{2} 的导数:\large \frac{\partial \lambda_{1}}{\partial \lambda_{2}} = -\frac{y_{2}}{y_{1}}

接下来的工作就很简单了,

求上面的展开式的一阶导数,得到:

\large \lambda_{2}(K_{11}+K_{22}-2K_{12})-1+\frac{y_{2}}{y_{1}}-y_{2}(v_{2}-v_{1})+(K_{11}-K_{12})Ay_{2}

再求二阶导数,得到:

\large K_{11}+K_{22}-2K_{12}

如果\large K_{11}+K_{22}-2K_{12}>0 , 那么展开式是凸函数,在一阶导数等于0的时候取得最小值,即:

\large \lambda_{2}(K_{11}+K_{22}-2K_{12})=1-\frac{y_{2}}{y_{1}}+y_{2}(v_{2}-v_{1})-(K_{11}-K_{12})Ay_{2}

对于上式,我们再将 \large v_{1},v_{2},A 代入其中(注意这里 \large v_{1},v_{2},A 中的 \large \lambda 都是 \large old 的,而上式左边我们要求的 \large \lambda_{2} 是 \large \lambda_{2}^{new}的最优解,即 \large \lambda_{2}^{new*},同时注意到 \large 1 = y_{2}^{2}, \frac{y_{2}}{y_{1}}=y_{2}y_{1}, 于是,上式可进一步变为

 

\large \lambda_{2}^{new*}(K_{11}+K_{22}-2K_{12})= \lambda_{2}^{old}(K_{11}+K_{22}-2K_{12}) \\\\+ y_{2}(u_{1}-u_{2}+y_{2}-y_{1})

进一步,令 \large E_{i} = u_{i} - y_{i}, 即预测值与真实值之差, \large \eta =K_{11}+K_{22}-2K_{12},我们得到求 \large \lambda_{2}^{new} 的公式:

\large \lambda_{2}^{new*} = \lambda_{2}^{old} + \frac{y_{2}(E_{1}-E_{2})}{\eta }

还记得我们之前求到的 \large \lambda_{2}^{new} 的取值范围吗?此处就派上用场了。我们要将这个值与 \large \lambda_{2}^{new} 的取值范围进行比较,具体地:

\large \lambda_{2}^{new} = \begin{Bmatrix} H , \lambda_{2}^{new*} > H \\ \lambda_{2}^{new*} , L< \lambda_{2}^{new*} <H \\ L,\lambda_{2}^{new*} <L \end{Bmatrix}

其实更严谨地说,\large \lambda_{2}^{new} 的取值情况要视其单调性而定。此处假定了 \large \eta > 0, 对于 \large \eta\leq 0 的情况,最优解在边界取得。具体可以参见http://blog.csdn.net/luoshixian099/article/details/51227754。这里就不再赘述了。

接下来, \large \lambda_{1}^{new} 可用公式 \large \lambda_{1}^{new}y_{1}+\lambda_{2}^{new}y_{2}=\lambda_{1}^{old}y_{1}+\lambda_{2}^{old}y_{2} 求出来。

现在我们求到了 \large \lambda_{1}^{new},\lambda_{2}^{new} ,可以根据这两个新的变量求到两个新的 \large b ,那么问题又来了,我们该选择哪一个 \large b 呢?一个很直观的逻辑是选择使得超平面最准确的那一个。那么怎样判断准不准呢?显然,由支持向量构造出来的超平面是最准确的,因此,选择的标准就出来了:

\large b^{new}= \begin{Bmatrix} b_{1},\quad if \quad 0<\lambda_{1}^{new}<C \\ b_{2}, \quad if \quad 0<\lambda_{2}^{new}<C \\ (b_{1}+b_{2})/2,\quad otherwise \end{Bmatrix}

此处,\large b_{1},b_{2} 的计算也有技巧。 如果 \large 0<\lambda_{1}^{new}<C ,那么根据KKT条件,\large 1-y_{1}(\textbf{w}^{T}\textbf{x}_{1}+b_{1})=0

\large b_{1} = y_{1}-x_{1}\sum_{j=1}^{m}\lambda_{j}x_{j}y_{j}=y_{1}-\sum_{j=1}^{m}\lambda_{j}y_{j}K_{1j}\\\\ =y_{1}-\lambda_{1}^{new}y_{1}K_{11}-\lambda_{2}^{new}y_{2}K_{12}-\sum_{j=3}^{m}\lambda_{j}y_{j}K_{1j}\\\\

其中,

\large \sum_{j=3}^{m}\lambda_{j}y_{j}K_{1j} \\\\=(\sum_{j=3}^{m}\lambda_{j}y_{j}K_{1j}+\lambda_{1}^{old}y_{1}K_{11}+\lambda_{2}^{old}y_{2}K_{12})-\lambda_{1}^{old}y_{1}K_{11}-\lambda_{2}^{old}y_{2}K_{12}\\\\ =u_{1}-b^{old}-\lambda_{1}^{old}y_{1}K_{11}-\lambda_{2}^{old}y_{2}K_{12}

所以,

\large b_{1}\\\\=y_{1}-\lambda_{1}^{new}y_{1}K_{11}-\lambda_{2}^{new}y_{2}K_{12}- u_{1}+b^{old}+\lambda_{1}^{old}y_{1}K_{11}+\lambda_{2}^{old}y_{2}K_{12} \\\\ =b^{old}-E_{1}+y_{1}K_{11}(\lambda_{1}^{old}-\lambda_{1}^{new})+y_{2}K_{12}(\lambda_{2}^{old}-\lambda_{2}^{new})

同理,

\large b_{2}=b^{old}-E_{2}+y_{2}K_{21}(\lambda_{1}^{old}-\lambda_{1}^{new})+y_{2}K_{22}(\lambda_{2}^{old}-\lambda_{2}^{new})

到此为止,我们所有的求解就完成了。最后就是不断重复这样的过程。所以,再给大家介绍一下SMO算法的步骤。

四、算法步骤

1. 选取要更新的变量 \large \lambda_{1},\lambda_{2},选取的原则是不满足KKT条件。

2. 计算其中一个变量的上下界,根据公式:

\large u_{i} = y_{i}(\mathbf{w}^{T}\textbf{}{x}_{i}+b )

\large E_{i} = u_{i} - y_{i}

\large K_{ij} = x_{i}^{T}x_{j}

\large \eta =K_{11}+K_{22}-2K_{12}>0

\large \lambda_{2}^{new*} = \lambda_{2}^{old} + \frac{y_{2}(E_{1}-E_{2})}{\eta }

以及其上下界

求出新解

3. 根据公式

\large \lambda_{1}^{new}y_{1}+\lambda_{2}^{new}y_{2}=\lambda_{1}^{old}y_{1}+\lambda_{2}^{old}y_{2}

求解另一个变量

4. 根据公式

\large b_{1} =b^{old}-E_{1}+y_{1}K_{11}(\lambda_{1}^{old}-\lambda_{1}^{new})+y_{2}K_{12}(\lambda_{2}^{old}-\lambda_{2}^{new})

\large b_{2}=b^{old}-E_{2}+y_{1}K_{21}(\lambda_{1}^{old}-\lambda_{1}^{new})+y_{2}K_{22}(\lambda_{2}^{old}-\lambda_{2}^{new})

\large b^{new}= \begin{Bmatrix} b_{1},\quad if \quad 0<\lambda_{1}^{new}<C \\ b_{2}, \quad if \quad 0<\lambda_{2}^{new}<C \\ (b_{1}+b_{2})/2,\quad otherwise \end{Bmatrix}

求 \large b

5. 重复上述过程直到满足算法停止条件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值