前言
经过前面三篇漫长的 SVM 介绍以及 SMO 算法的原理介绍和公式推导,终于到了 SMO 的算法实现以及最终的 SVM 分类实现了。那么现在就先看看 SMO 的 python 实现。
SMO python 实现
代码中的 \(\alpha_{i}\),\(\alpha_{j}\) 对应了前一篇中的 \(\alpha_{1}\) 和 \(\alpha_{2}\),并且代码中的计算方式都是套用前一篇中推导出来的公式,请仔细体会。另外,以下我把选出来的 \(\alpha_{i}\),\(\alpha_{j}\) 分别成为第一个 alpha 值和第二个 alpha 值。
首先定义一个核转换函数用于计算训练集矩阵(X)与任意给定样本矩阵间的核转换结果。
下面定义一个 SVMStruct
类来封装一些属性和方法,以便可以快速构建一个 SVM 模型。
接下来定义一些 SVMStruct
类下的辅助方法。
接下来,函数 innerL
为 SMO 主程序内层循环的代码。
外层循环的代码:
计算权重 \(w\) 的函数:
分类函数的代码:
最后是 plot 出样本点,和划分线:
那么最后可视化的结果为:
- 本例中所用的数据集必须使用线性核才使得样本可分。
- 本文代码见个人github repository MLCodeOnTheBlog
参考
[1] <<机器学习实战-中文版>>
[2] Sequential Minimal Optimization:
A Fast Algorithm for Training Support Vector Machines by John C. Platt
[3] 机器学习算法与Python实践之(四)支持向量机(SVM)实现 by zouxy
[4] 机器学习算法实践-SVM中的SMO算法 by PytLab酱