今天是机器学习专题第35篇文章,我们继续SVM模型的原理,今天我们来讲解的是SMO算法。

公式回顾

在之前的文章当中我们对硬间隔以及软间隔问题都进行了分析和公式推导,我们发现软间隔和硬间隔的形式非常接近,只有少数几个参数不同。所以我们着重来看看软间隔的处理。

通过拉格朗日乘子法以及对原问题的对偶问题进行求解,我们得到了二次规划:

它应该满足的KTT条件如下:

也就是说我们要在这些条件下去求解(1)式的极值,在这个约束的情况下,虽然我们已经把式子化简成了只有一种参数α\alphaα,但这个极值又应该怎么求呢?为了解决这个问题,我们需要引入一个新的算法,也是今天的文章的主要介绍的内容——SMO算法

SMO算法简介

SMO的全写是Sequential Minimal Optimization,翻译过来是序列最小优化算法。算法的核心思想是由于我们需要寻找的是一系列的α\alphaα值使得(1)取极值,但问题是这一系列的值我们很难同时优化。所以SMO算法想出了一个非常天才的办法,把这一系列的α\alphaα中的两个看成是变量,其它的全部固定看成是常数。

这里有一个问题是为什么我们要选择两个α\alphaα看成是变量而不选一个呢?选一个不是更加简单吗?因为我们的约束条件当中有一条是∑yiαi=0\sum y_i\alpha_i=0∑yi​αi​=0,所以如果我们只选择一个α\alphaα进行调整的话,那么显然会破坏这个约束。所以我们选择两个,其中一个变化,另外一个也随着变化,这样就可以保证不会破坏约束条件了。

为了方便叙述,我们默认选择的两个α\alphaα分别是α1,α2\alpha_1, \alpha_2α1​,α2​。另外由于我们涉及xiTxjx_i^Tx_jxiT​xj​的操作,我们令Kij=xiTxjK_{ij}=x_i^Tx_jKij​=xiT​xj​。这样上面的(1)式可以写成:

其中由于y1=±1y_1 = \pm 1y1​=±1,所以yi2=1y_i^2 = 1yi2​=1,上面的Constant表示除了α1,α2\alpha_1, \alpha_2α1​,α2​以外的常数项。我们假设α1y1+α2y2=k\alpha_1y_1 + \alpha_2y_2 = kα1​y1​+α2​y2​=k,其中α1,α2∈[0,C]\alpha_1, \alpha_2 \in [0, C]α1​,α2​∈[0,C],由于yiy_iyi​只有两个选项1或者-1,所以我们可以分情况讨论。

分情况讨论

首先我们讨论y1y_1y1​和y2y_2y2​不同号时,无非两种,第一种情况是α1−α2=k\alpha_1 - \alpha_2 = kα1​−α2​=k,也就是α2=α1−k\alpha_2 = \alpha_1 - kα2​=α1​−k,我们假设此时k > 0,第二种情况是α2=α1+k\alpha_2 = \alpha_1 + kα2​=α1​+k,我们假设此时k < 0。我们很容易发现对于第一种情况,如果 k < 0,其实就是第二种情况,同样对于第二种情况,如果k > 0其实就是第一种情况。这变成了一个线性规划问题,我们把图画出来就非常清晰了。

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

同理,我们画出α1,α2\alpha_1, \alpha_2α1​,α2​同号时的情况,也有k > 0 和 k < 0两种。

第一种情况是y1=y2=1y_1 = y_2 = 1y1​=y2​=1,这时α1+α2=k\alpha_1 + \alpha_2 = kα1​+α2​=k,此时 k > 0,对应的α2\alpha_2α2​的取值是(0,α1o+α2o)(0, \alpha_{1o} + \alpha_{2o})(0,α1o​+α2o​)。当k > C的时候,这时候也就是右上角1’的情况,此时过了中间的虚线,α2\alpha_2α2​的范围是(α1o+α2o−C,C)(\alpha_{1o} + \alpha_{2o} - C, C)(α1o​+α2o​−C,C)。

第二种情况是y1=y2=−1y_1 = y_2 = -1y1​=y2​=−1,此时α1+α2=k\alpha_1 + \alpha_2 = kα1​+α2​=k,此时k < 0,由于这个时候是不符合约束条件0≤α1,α2≤C0\le \alpha_1, \alpha_2 \le C0≤α1​,α2​≤C的,所以此时没有解。这两种情况综合一下,可以得到下界L是max⁡(0,α1o+α2o−C)\max(0, \alpha_{1o} + \alpha_{2o} - C)max(0,α1o​+α2o​−C),上届H是min⁡(α1o+α2o,C)\min(\alpha_{1o} + \alpha{2o}, C)min(α1o​+α2o,C)。

我们假设我们通过迭代之后得到的下一轮α2\alpha_2α2​是α2new,unc\alpha_{2new, unc}α2new,unc​,这里的unc是未经过约束的意思。那么我们加上刚才的约束,可以得到:

这里的α2new,unc\alpha_{2new,unc}α2new,unc​是我们利用求导得到取极值时的α2\alpha_2α2​,但问题是由于存在约束,这个值并不一定能取到。所以上述的一系列操作就是为了探讨约束存在下我们能够取到的极值情况。如果看不懂推导过程也没有关系,至少这个结论需要搞明白。

代入消元

我们现在已经得到了下一轮迭代之后得到的新的α2\alpha_2α2​的取值范围,接下来要做的就是像梯度下降一样,求解出使得损失函数最小的α1\alpha_1α1​和α2\alpha_2α2​的值,由于α1+α2\alpha_1 + \alpha_2α1​+α2​的值已经确定,所以我们求解出其中一个即可。

我们令α1y1+α2y2=ξ\alpha_1y_1 + \alpha_2y_2 = \xiα1​y1​+α2​y2​=ξ,那么我们可以代入得到α1=y1(ξ−α2y2)\alpha_1 = y_1(\xi - \alpha_2y_2)α1​=y1​(ξ−α2​y2​)

我们把这个式子代入原式,得到的式子当中可以消去α1\alpha_1α1​,这样我们得到的就是只包含α2\alpha_2α2​的式子。我们可以把它看成是一个关于α2\alpha_2α2​的函数,为了进一步简化,我们令vi=∑j=3myjαjKi,j,Ei=f(xi)−yi=∑j=1mαjyjKi,j+b−yiv_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_ivi​=∑j=3m​yj​αj​Ki,j,Ei​=f(xi​)−yi​=∑j=1m​αj​yj​Ki,j​+b−yi​

这里的EiE_iEi​表示的是第i个样本真实值与预测值之间的差,我们把上面两个式子代入原式,化简可以得到:

f(α2)=12K11(ξ−α2y2)+12K22α22+y2K12(ξ−α2y2)α2−(ξ−α2y2)y1−α2+(ξ−α2y2)v1+y2α2v2f(\alpha_2) = \frac12 K_{11}(\xi - \alpha_2y_2) + \frac12K_{22}\alpha_2^2 + y_2K_{12}(\xi- \alpha_2y_2)\alpha_2 - (\xi - \alpha_2y_2)y_1 - \alpha_2 + (\xi - \alpha_2y_2)v_1 + y_2\alpha_2v_2f(α2​)=21​K11​(ξ−α2​y2​)+21​K22​α22​+y2​K12​(ξ−α2​y2​)α2​−(ξ−α2​y2​)y1​−α2​+(ξ−α2​y2​)v1​+y2​α2​v2​

接下来就是对这个式子进行求导求极值,就是高中数学的内容了。

∂W∂α2=K11α2+K22α2−2K12α2−K11ξy2+K12ξy2+y1y2−1−v1y2+y2v2=0\frac {\partial W}{\partial\alpha_2}=K_{11}\alpha_2 + K_{22}\alpha_2 - 2K_{12}\alpha_2 - K{11}\xi y_2+K{12}\xi y_2 + y_1y_2 -1 - v_1y_2 + y_2v_2 = 0∂α2​∂W​=K11​α2​+K22​α2​−2K12​α2​−K11ξy2​+K12ξy2​+y1​y2​−1−v1​y2​+y2​v2​=0

我们求解这个式子,最终可以得到:

α2new,unc=α2o+y2(E1−E2)K11+K22−2K12\alpha_{2new, unc} = \alpha_{2o} + \frac{y_2(E_1 - E_2)}{K_{11}+K_{22} - 2 K_{12}}α2new,unc​=α2o​+K11​+K22​−2K12​y2​(E1​−E2​)​

我们根据这个式子就可以求出α2\alpha_2α2​下一轮迭代之后的值,求出值之后,我们在和约束的上下界比较一下,就可以得到在满足约束的情况下可以取到的最好的值。最后,我们把α2\alpha_2α2​代入式子求解一下α1\alpha_1α1​。这样我们就同时优化了一对α\alphaα参数,SMO算法其实就是重复使用上面的优化方法不停地选择两个参数进行优化,直到达到迭代次数,或者是不能再带来新的提升为止。

整个算法的逻辑其实是不难理解的,但是中间公式的推导过程实在是多了一些。这也是我把SVM模型放到机器学习专题最后来讲解的原因,在下一篇文章当中,我们将会为大家带来SVM模型核函数的相关内容,结束之后我们机器学习专题就将迎来尾声了,再之后我们将会开始深度学习的专题,敬请期待吧。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

原文链接,求个关注

深入理解SVM,详解SMO算法相关推荐

  1. Unicode双向算法详解(bidi算法)(二)

    作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...

  2. Unicode双向算法详解(bidi算法)(一)

    Unicode双向算法详解(bidi算法)(一) 注:本文已独家授权给脚本之家(ID:jb51net)公众号发布 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是 ...

  3. Unicode双向算法详解(bidi算法)(三)

    Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...

  4. 扩展Euclidean算法求乘法逆原理详解与算法实现

    [利用扩展Euclidean算法求乘法逆] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 6 ...

  5. 详解线性回归算法的纯Python实现

    ↑↑↑关注后"星标"简说Python人人都可以简单入门Python.爬虫.数据分析 简说Python推荐 来源|天池大数据科研平台作者|黄佳 零基础学机器学习--一文详解线性回归算 ...

  6. 【机器学习系列】之SVM核函数和SMO算法

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] [机器学习系列]之SVM硬间隔和软间隔 [机器学习系列]之SVM核函数和SMO ...

  7. 详解rsync算法--如何减少同步文件时的网络传输量

    详解rsync算法--如何减少同步文件时的网络传输量 先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A.B和server上的文件内容都是相同的(记为File.1).某 ...

  8. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  9. 【算法知识】详解基数排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...

最新文章

  1. 用代码优雅的终止springboot服务
  2. 使用Pylint进行Python代码规范检查
  3. 计算机在课堂中的应用论文,任务教学法在计算机教学中的应用论文
  4. 基于Exchange 2003的搭建高可用的邮件平台 之一:群集的配置
  5. 【python数据挖掘课程】二十四.KMeans文本聚类分析互动百科语料
  6. 2016个人阅读计划
  7. 物联网正占据有利风口 2017年实现商用不难
  8. 【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】
  9. CentOS7 编译安装golang和rpm安装golang
  10. c语言数据类型_C语言基础数据类型
  11. jee-weapp是一套基于jfinal,dubbo微服务开发的微信小程序商城项目,首次开放全部拼团前后台源码
  12. Python 测试驱动开发读书笔记(一)使用功能测试协助安装Django
  13. 在JavaScript中复制数组的最快方法-切片与“ for”循环
  14. 【物联网控制技术】--第一章--【自动控制】【反馈控制】【调节过程】【系统要求】【典型的外部输入信号】
  15. 根据APK文件查看应用的MD5签名
  16. matlab NORM函数
  17. python 时间转为秒数
  18. 简明扼要理解YOLO v3
  19. JavaWeb的项目设计思路
  20. 微信小程序登录过程中,实现数据解密操作

热门文章

  1. 海康摄像头SDK二次开发错误问题解决方案(三):3. 错误:提示如“HCNetSDK.dll”组件缺失,无法加载问题
  2. C语言刷题随记 ——奖金分配
  3. python用post提交数据_python通过post提交数据的方法
  4. VBA Aplication函数之 Vlookup的运用
  5. Java实现文件的加密与解密
  6. playfair 加密与解密
  7. 光学指纹锁与半导体指纹锁的区别在哪?
  8. Python用雷达图展示某学生成绩问题/2020年12月
  9. String和toString区别?
  10. dubbo 支持的7种协议