作者:[已重置]
链接:http://www.zhihu.com/question/40546280/answer/88539689
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

SMO(Sequential Minimal Optimization)是针对求解SVM问题的Lagrange对偶问题,一个二次规划式,开发的高效算法。传统的二次规划算法的计算开销正比于训练集的规模,而SMO基于问题本身的特性(KKT条件约束)对这个特殊的二次规划问题的求解过程进行优化。对偶问题中我们最后求解的变量只有Lagrange乘子向量,这个算法的基本思想就是每次都只选取一对,固定向量其他维度的元素的值,然后进行优化,直至收敛。

SMO干了什么?
首先,整个对偶问题的二次规划表达如下:

SMO在整个二次规划的过程中也没干别的,总共干了两件事:

  • 选取一对参数
  • 固定向量的其他参数,将代入上述表达式进行求最优解获得更新后的

SMO不断执行这两个步骤直至收敛。

因为有约束存在,实际上的关系也可以确定。这两个参数的和或者差是一个常数。
<img src="https://pic1.zhimg.com/071f3351b3eee2db40fea3ba944f9d7c_b.png" data-rawwidth="633" data-rawheight="274" class="origin_image zh-lightbox-thumb" width="633" data-original="https://pic1.zhimg.com/071f3351b3eee2db40fea3ba944f9d7c_r.png">所以虽然宣传上说是选择了一对所以虽然宣传上说是选择了一对,但还是选择了其中一个,将另一个写作关于它的表达式代入目标函数求解。

为什么SMO跑的那么快,比提出之前的算法不知道高到哪里去了?
正如上面提到的,在固定其他参数以后,这就是一个单变量二次规划问题,仅有的约束也是这个变量,显然有闭式解。不必再调用数值优化算法。

KKT条件是对偶问题最优解的必要条件

除了第一个非负约束以外,其他约束都是根据目标函数推导得到的最优解必须满足的条件,如果违背了这些条件,那得到的解必然不是最优的,目标函数的值会减小。

所以在SMO迭代的两个步骤中,只要中有一个违背了KKT条件,这一轮迭代完成后,目标函数的值必然会增大。Generally speaking,KKT条件违背的程度越大,迭代后的优化效果越明显,增幅越大。

怎样跑的更快?
和梯度下降类似,我们要找到使之优化程度最大的方向(变量)进行优化。所以SMO先选取违背KKT条件程度最大的变量,那么第二个变量应该选择使目标函数值增大最快的变量,但是这个变量怎么找呢?比较各变量优化后对应的目标函数值的变化幅度?这个样子是不行的,复杂度太高了。

SMO使用了一个启发式的方法,当确定了第一个变量后,选择使两个变量对应样本之间最大的变量作为第二个变量。直观来说,更新两个差别很大的变量,比起相似的变量,会带给目标函数更大的变化。间隔的定义也可以借用偏差函数

我们要找的也就是使对于来说使最大的

很惭愧,只做了一点微小的工作。

References

[1] Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998).

最近刚看完smo算法的代码,所以试着回答题主的问题。
解决svm首先将原始问题转化到对偶问题,而对偶问题则是一个凸二次规划问题,理论上你用任何一个解决凸二次规划的软件包都可以解决,但是这样通常来说很慢,大数据情况下尤其不实际,smo是微软研究院的大神发明的解决svm对偶问题的优化算法,可以更快找到好的解。通常而言分简化版和优化版smo算法。
简化版:每次迭代随机选取alpha_i和alpha_j,当然其中要有一个违反kkt条件,通常先选一个违反kkt条件的alpha_i,然后随机选择一个alpha_j,然后用类似坐标上升(下降)的算法来优化目标函数,具体细节题主可以看相关代码,推荐《machine learning in action》的svm部分,但是这样的优化方式并不是最快的;
优化版:用启发式的算法选择alpha_j,即选择alpha_j,使得|Ei-Ej|最大,至于为什么,因为变量的更新步长正比于|Ei-Ej|,也就是说我们希望变量更新速度更快,其余的和简化版其实区别不大;
应该还有其他版本的smo,没看过不做评论,希望对题主有用。

作者:司徒功源
链接:http://www.zhihu.com/question/40546280/answer/87204403
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

SMO算法是干什么的?有什么作用?相关推荐

  1. 支持向量机SVM(五)SMO算法

    11 SMO优化算法(Sequential minimal optimization) SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规 ...

  2. SVM学习总结(三)SMO算法流程图及注释源码

    一.SMO算法流程图 算法中的流程图绘制是根据第二节中的源码绘制的. 二.SMO算法C++源码 下面的源码是在csdn上下的,非常适合初学者的,而且smo算法实现的主体架构和实现都与SMO算法原论文基 ...

  3. Platt SMO算法

    Platt SMO算法 1996年,John Platt 发布了一个称为SMO的强大算法,用于训练SVM SMO表示序列最小优化(SequentialMinimal Optimization).Pla ...

  4. 机器学习笔记——支持向量机SMO算法完整版代码分析

    机器学习笔记--支持向量机SMO算法完整版代码分析 代码大体分析 外循环 参数类 内循环 KKT条件判断 eCache参数 完整SMO代码 添加核函数代码 代码参考书籍:<机器学习实战> ...

  5. SMO算法详细推导(Sequential Minimal Optimization)

    本文针对一般性的"软判断的核函数的对偶问题的SVM",形如下式: 上式问题所在:当采样点 xix_ixi​ 选取50000个点时,则基于核函数变量Θ(xi,xj)\bm{\Thet ...

  6. SVM SMO算法代码详细剖析

    前言 一:本文要结合SVM理论部分来看即笔者另一篇: SVM原理从头到尾详细推导 二:有了理论部分下面就是直接代码啦,本文用四部分进行介绍:最简版的SMO,改进版platt SMO,核函数,sklea ...

  7. 机器学习算法实战项目—支持向量机(2)—完整版的SMO算法

    2.完整版的SMO算法 在几百个点组成的小规模数据集上,简化版SMO算法的运行是没有什么问题的,但是在更大的数据集上的运行速度就会变慢. 刚才已经讨论了简化版SMO算法,下面我们就讨论完整版的Plat ...

  8. 基于SVM和SMO算法的向量机训练算法研究

    目 录 绪论 1 1.1支持向量机的研究背景.意义 1 1.2 SVM算法研究现状 2 1.3 论文内容及结构安排 4 统计学习理论基础 4 2.1 学习问题的表示 4 2.2 期望风险.经验风险 5 ...

  9. 支持向量机SVM之-SMO算法

    序列最小最优化算法 序列最小最优化算法(sequential minimal optimization,简称SMO)是由Platt在1998年提出,用于解决多变量的凸优化问题.当变量个数很多的时候,一 ...

  10. smo算法C语言,SMO算法详解

    一.我们先回顾下SVM问题. A.线性可分问题 1.SVM基本原理: SVM使用一种非线性映射,把原训练  数据映射到较高的维.在新的维上,搜索最佳分离超平面,两个类的数据总可以被超平面分开. 2.问 ...

最新文章

  1. URI URL 简介区别
  2. web开发入门到深入-WebAssembly(1)
  3. C语言Kruskal 算法 (MST)(附完整源码)
  4. Nginx配置文件nginx.conf的文件结构
  5. 1021. 个位数统计 (15)
  6. fabric 转账_Fabric 学习笔记-架构初探
  7. oracle增加网络服务,Oracle 配置监听和本地网络服务
  8. 关于主函数main(int argc,char *argv[])
  9. select count(*) 和 select count(1) 以及 select count(column) 的区别
  10. Windows下VB6.0开发——VB程序断点调试与顺序执行不一致问题(通信原因)
  11. java——7个小案例
  12. 史上最全linux内核配置详解
  13. 计算机科学顶级国际会议,顶级会议推荐:计算机科学理论会议5条
  14. Vue学习(学习打卡Day13)
  15. 手机没Root?你照样可以渗透路由器
  16. linux进程kill命令关不掉
  17. ORACLE:分组函数
  18. 医美“非标化”埋雷 新氧科技流量变现受制约
  19. selenium中ByChained方法
  20. 并查集解决朋友圈问题

热门文章

  1. nagios搭建和邮件短信报警设置
  2. Php clearstatcache() 函数详解
  3. [论离职]走的人不少,来的人更多
  4. Spring Boot入门(4)-事务管理
  5. Eclipse 无法打开Console,show view无效
  6. android中的actionbar,android中开启actionbar的两种方法
  7. python邮件群发_Python操作Gmail@定时定向群发邮件
  8. 云服务器远程连接的设置方法、安全组设置(外网可访问)
  9. python盖帽法_干货:用Python进行数据清洗,这7种方法你一定要掌握
  10. BNU 背包密码(编码与解密)