SVM详解之使用numpy低效实现SMO算法

2020年12月21日

(本文使用https://www.codecogs.com/进行latex渲染,若latex公式有问题,请开启全局梯子)

一直以来SVM都停留在一看就大概知道,一上手推导就傻眼的阶段。实际上还是没有真正地理解了SVM的精髓,对于 关键定理 这里总是囫囵吞枣。看一看网上大部分的教程,也都是以推导为主,所以想手写实现一下,加深理解。

talk is cheap, show me the code.

假设我们已经艰难地推导到了最后,得到了SVM的对偶问题上:

这时候,我们需要求解一系列的值了,只要得到了 的值,那么W,b 就好求了。 西瓜书 上也就到了这里,告诉我们这是一个二次规划问题(这我也不会啊😭)。顺理成章地引入了 SMO 算法来求解,得到了后,对W,b进行更新迭代:

![](https://github.com/anxingle/anxingle.github.io/blob/master/public/img/ML/svm_latex.png?raw=true) 即可求出超分类面,也就是分类函数:

这是基本的SVM推导,如果这一步还不知道怎么来的,那就需要拿 [西瓜书](https://book.douban.com/subject/26708119/) 好好推导一下了。 我们回过头来继续看SMO算法如何来求解的 ,实际上这里我也不能明白SMO的精髓,只能按着 [wikipedia SMO序列最小优化算法](https://zh.wikipedia.org/wiki/序列最小优化算法) 中介绍的的流程来进行计算了😏。 ![](https://github.com/anxingle/anxingle.github.io/blob/master/public/img/ML/smo.jpeg?raw=true) 其中,$L$和$H$分别是$\alpha_{2}^{new}$ 的下界和上界。特别地,有: ![](https://github.com/anxingle/anxingle.github.io/blob/master/public/img/ML/smo2.jpeg?raw=true) 推导过程实在繁琐,我们这里直接拿作者的解析解: > 记 , 这里为核函数,用于将低维空间的数据映射到高维空间,我们以后再谈; > 记,也就是更新后的SVM预测值与真实值的误差。 得到:

此时未考虑约束条件下的解,如果考虑约束:

即可得上下界:

以及:

则最终的更新公式为:

得到 后,也可以同样求出来:

然后循环对所有的进行选取,便可以进行优化更新了。 根据Platt的原文提供的伪代码,我们有如下实现**(PC或MAC下加载以下代码展示)**: ## 数据分布如下: 绘制: ![](https://github.com/anxingle/anxingle.github.io/blob/master/public/img/ML/svm_data.png?raw=true) ![](https://github.com/anxingle/anxingle.github.io/blob/master/public/img/ML/svm_line.png?raw=true) ## 致谢 本文参考文章: [理解支持向量机的三重境界](https://www.cnblogs.com/v-July-v/archive/2012/06/01/2539022.html) [看了这篇文章你还不懂SVM你就来打我](https://zhuanlan.zhihu.com/p/49331510) [一起学SVM之python实现SMO算法](https://www.bilibili.com/video/BV145411s7nY?t=3224)


-_-below can discuss!-_-