(本文使用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)