深入理解SVM,详解SMO算法
今天是机器学习专题第35篇文章,我们继续SVM模型的原理,今天我们来讲解的是SMO算法。
公式回顾
在之前的文章当中我们对硬间隔以及软间隔问题都进行了分析和公式推导,我们发现软间隔和硬间隔的形式非常接近,只有少数几个参数不同。所以我们着重来看看软间隔的处理。
通过拉格朗日乘子法以及对原问题的对偶问题进行求解,我们得到了二次规划:
&\min_{\alpha}\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_iy_jx_i^Tx_j -\sum_{i=1}^m\alpha_i \tag{1} \\
& \begin{array}{r@{\quad}r@{}l@{\quad}l}
s.t.& \sum_{i=1}^m \alpha_i y_i = 0 \\
& 0 \le \alpha_i \le C,&i=1,2,3\ldots,m\\
\end{array}
\end{align*}\]
它应该满足的KTT条件如下:
\alpha_i \ge 0, \beta_i \ge 0\\
y_i(\omega^T x_i + b) - 1 + \xi_i \ge 0\\\alpha_i(y_i(\omega^Tx_i + b) - 1 + \xi_i)=0\\\xi_i \ge0, \beta_i \xi_i = 0 \end{align*}\right.\]
也就是说我们要在这些条件下去求解(1)式的极值,在这个约束的情况下,虽然我们已经把式子化简成了只有一种参数\(\alpha\),但这个极值又应该怎么求呢?为了解决这个问题,我们需要引入一个新的算法,也是今天的文章的主要介绍的内容——SMO算法。
SMO算法简介
SMO的全写是Sequential Minimal Optimization,翻译过来是序列最小优化算法。算法的核心思想是由于我们需要寻找的是一系列的\(\alpha\)值使得(1)取极值,但问题是这一系列的值我们很难同时优化。所以SMO算法想出了一个非常天才的办法,把这一系列的\(\alpha\)中的两个看成是变量,其它的全部固定看成是常数。
这里有一个问题是为什么我们要选择两个\(\alpha\)看成是变量而不选一个呢?选一个不是更加简单吗?因为我们的约束条件当中有一条是\(\sum y_i\alpha_i=0\),所以如果我们只选择一个\(\alpha\)进行调整的话,那么显然会破坏这个约束。所以我们选择两个,其中一个变化,另外一个也随着变化,这样就可以保证不会破坏约束条件了。
为了方便叙述,我们默认选择的两个\(\alpha\)分别是\(\alpha_1, \alpha_2\)。另外由于我们涉及\(x_i^Tx_j\)的操作,我们令\(K_{ij}=x_i^Tx_j\)。这样上面的(1)式可以写成:
&\min_{\alpha1,\alpha_2}\frac{1}{2}K_{11}\alpha_1^2 + \frac{1}{2}K_{22}\alpha_2^2 + y_1y_2\alpha_1\alpha_2 - (\alpha_1 + \alpha_2) + y_1\alpha_1\sum_{i=3}^my_i\alpha_iK_{i1} + y_2\alpha_2\sum_{i=3}^my_i\alpha_iK_{i, 2} + Constant \tag{2} \\
& \begin{array}{r@{\quad}r@{}l@{\quad}l}
s.t.& \alpha_1y_1 + \alpha_2y_2 = -\sum_{i=3}^m y_i\alpha_i \\
& 0 \le \alpha_i \le C,&i=1,2,3\ldots,m\\
\end{array}
\end{align*}\]
其中由于\(y_1 = \pm 1\),所以\(y_i^2 = 1\),上面的Constant表示除了\(\alpha_1, \alpha_2\)以外的常数项。我们假设\(\alpha_1y_1 + \alpha_2y_2 = k\),其中\(\alpha_1, \alpha_2 \in [0, C]\),由于\(y_i\)只有两个选项1或者-1,所以我们可以分情况讨论。
分情况讨论
首先我们讨论\(y_1\)和\(y_2\)不同号时,无非两种,第一种情况是\(\alpha_1 - \alpha_2 = k\),也就是\(\alpha_2 = \alpha_1 - k\),我们假设此时k > 0,第二种情况是\(\alpha_2 = \alpha_1 + k\),我们假设此时k < 0。我们很容易发现对于第一种情况,如果 k < 0,其实就是第二种情况,同样对于第二种情况,如果k > 0其实就是第一种情况。这变成了一个线性规划问题,我们把图画出来就非常清晰了。

针对第一种情况,我们可以看出来\(\alpha_2\)的范围是\((0, C - \alpha_2 + \alpha_1)\),第二种情况的范围是\((\alpha_2 - \alpha_1, C)\)。这里我们把k又表示回了\(\alpha_1,\alpha_2\),由于我们要通过迭代的方法来优化\(\alpha_1,\alpha_2\)的取值,所以我们令上一轮的\(\alpha_1, \alpha_2\)分别是\(\alpha_{1o}, \alpha_{2o}\)。这里的o指的是old的意思,我们把刚才求到的结论综合一下,就可以得到\(\alpha_2\)下一轮的下界L是\(\max(0, \alpha_{2o} - \alpha_{1o})\),上界H是\(\min(C+\alpha_{2o} - \alpha_{1o}, C)\)。
同理,我们画出\(\alpha_1, \alpha_2\)同号时的情况,也有k > 0 和 k < 0两种。

第一种情况是\(y_1 = y_2 = 1\),这时\(\alpha_1 + \alpha_2 = k\),此时 k > 0,对应的\(\alpha_2\)的取值是\((0, \alpha_{1o} + \alpha_{2o})\)。当k > C的时候,这时候也就是右上角1'的情况,此时过了中间的虚线,\(\alpha_2\)的范围是\((\alpha_{1o} + \alpha_{2o} - C, C)\)。
第二种情况是\(y_1 = y_2 = -1\),此时\(\alpha_1 + \alpha_2 = k\),此时k < 0,由于这个时候是不符合约束条件\(0\le \alpha_1, \alpha_2 \le C\)的,所以此时没有解。这两种情况综合一下,可以得到下界L是\(\max(0, \alpha_{1o} + \alpha_{2o} - C)\),上届H是\(\min(\alpha_{1o} + \alpha{2o}, C)\)。
我们假设我们通过迭代之后得到的下一轮\(\alpha_2\)是\(\alpha_{2new, unc}\),这里的unc是未经过约束的意思。那么我们加上刚才的约束,可以得到:
\]
这里的\(\alpha_{2new,unc}\)是我们利用求导得到取极值时的\(\alpha_2\),但问题是由于存在约束,这个值并不一定能取到。所以上述的一系列操作就是为了探讨约束存在下我们能够取到的极值情况。如果看不懂推导过程也没有关系,至少这个结论需要搞明白。
代入消元
我们现在已经得到了下一轮迭代之后得到的新的\(\alpha_2\)的取值范围,接下来要做的就是像梯度下降一样,求解出使得损失函数最小的\(\alpha_1\)和\(\alpha_2\)的值,由于\(\alpha_1 + \alpha_2\)的值已经确定,所以我们求解出其中一个即可。
我们令\(\alpha_1y_1 + \alpha_2y_2 = \xi\),那么我们可以代入得到\(\alpha_1 = y_1(\xi - \alpha_2y_2)\)
我们把这个式子代入原式,得到的式子当中可以消去\(\alpha_1\),这样我们得到的就是只包含\(\alpha_2\)的式子。我们可以把它看成是一个关于\(\alpha_2\)的函数,为了进一步简化,我们令\(v_i = \sum_{j=3}^my_j \alpha_j K{i, j} , E_i = f(x_i ) - y_i = \sum_{j=1}^m \alpha_jy_jK_{i, j} + b - y_i\)
这里的\(E_i\)表示的是第i个样本真实值与预测值之间的差,我们把上面两个式子代入原式,化简可以得到:
\]
接下来就是对这个式子进行求导求极值,就是高中数学的内容了。
\]
我们求解这个式子,最终可以得到:
\]
我们根据这个式子就可以求出\(\alpha_2\)下一轮迭代之后的值,求出值之后,我们在和约束的上下界比较一下,就可以得到在满足约束的情况下可以取到的最好的值。最后,我们把\(\alpha_2\)代入式子求解一下\(\alpha_1\)。这样我们就同时优化了一对\(\alpha\)参数,SMO算法其实就是重复使用上面的优化方法不停地选择两个参数进行优化,直到达到迭代次数,或者是不能再带来新的提升为止。
整个算法的逻辑其实是不难理解的,但是中间公式的推导过程实在是多了一些。这也是我把SVM模型放到机器学习专题最后来讲解的原因,在下一篇文章当中,我们将会为大家带来SVM模型核函数的相关内容,结束之后我们机器学习专题就将迎来尾声了,再之后我们将会开始深度学习的专题,敬请期待吧。
今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

深入理解SVM,详解SMO算法的更多相关文章
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- SVD在推荐系统中的应用详解以及算法推导
SVD在推荐系统中的应用详解以及算法推导 出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...
- Java虚拟机详解04----GC算法和种类【重要】
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [笔记]关于支持向量机(SVM)中 SMO算法的学习(一)理论总结
1. 前言 最近又重新复习了一遍支持向量机(SVM).其实个人感觉SVM整体可以分成三个部分: 1. SVM理论本身:包括最大间隔超平面(Maximum Margin Classifier),拉格朗日 ...
- 统计学习方法c++实现之六 支持向量机(SVM)及SMO算法
前言 支持向量机(SVM)是一种很重要的机器学习分类算法,本身是一种线性分类算法,但是由于加入了核技巧,使得SVM也可以进行非线性数据的分类:SVM本来是一种二分类分类器,但是可以扩展到多分类,本篇不 ...
- <转>SVM实现之SMO算法
转自http://blog.csdn.net/zouxy09/article/details/17292011 终于到SVM的实现部分了.那么神奇和有效的东西还得回归到实现才可以展示其强大的功力.SV ...
- Java虚拟机详解04----GC算法和种类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 机器学习——支持向量机(SVM)之Platt SMO算法
Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...
- 机器学习-SVM中的SMO算法详解
随机推荐
- 8.hbase写入流程和读取流程
1 hbase写入流程 hbase中无论是新增数据还是修改已有行,其内部流程都是一样的,hbase执行写入时会写到两个地方,write-ahead log 简称wal 也叫hlog 预写式日志 和 M ...
- pandas电子表格的读取(pandas中的read_excel)
上面那篇文章中,初步介绍了一个文本文件的读取:接下来介绍另外一种常见的本地数据格式,那就是Excel电子表格,如果读者在学习或者工作中需要使用Python分析某个Excel表格数据,改如何完成第一个的 ...
- Java并发---concurrent包
一.包的结构层次 其中包含了两个子包atomic和locks,另外字concurrent下的阻塞队列以及executor,这些就是concurrent包中的精华.而这些类的实现主要是依赖于volati ...
- 从《三体》到“中美科技战”,3分钟理解“网络”D丝为什么要迎娶“算力”白富美
摘要:在多维的世界里,高维的文明对于低维文明具有碾压的优势,而网络也正在从二维走向三维!网络硬件的竞争主要是“芯片+算法”. 从三体到中美科技战,理解网络与算力深度融合助力高维度竞争 1:对抗封锁,需 ...
- Java多线程_同步工具CyclicBarrier
CyclicBarrier概念:CyclicBarrier是多线程中的一个同步工具,它允许一组线程互相等待,直到到达某个公共屏障点.形象点儿说,CyclicBarrier就是一个屏障,要求这一组线程中 ...
- 你还在用a标签吗?——用button替代a
前言:a标签,不止你在用,我也在用.但某些时候我们可以考虑用button替代a. 在多页应用中,a标签很常见,我们常用来作为一个普通超链接,进行页面跳转. 而在单页应用中,我们使用路由进行页面切换,a ...
- 使用手机安装Windows系统------DriveDroid
今天给大家推荐的软件是: DriveDroid 1.说来都是无奈,前一段时间,重装系统结果按完之后进不去系统,然后手贱又把U启动盘给弄坏了 2.本来想这下需要去找同学借个电脑了,然后就想手机可不可以啊 ...
- springboot文件上传(可单文件/可多文件)
获取文件内容,是从InputStream中获取,添加到指定位置的文件 如下所示 public static void getFile(InputStream is,File fileName) thr ...
- 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇
本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...
- 基于Log4Net记录日志到SQLServer(自定义字段)
本文记录通过log4net将日志信息记录到SQLServer数据库中. 1.新建控制台应用程序 Log4NetDemo: 2.通过NuGet安装Log4Net (项目版本2.0.8): 3.项目根目录 ...