SVM系列之SMO的Python实现(四)

前言

经过前面三篇漫长的 SVM 介绍以及 SMO 算法的原理介绍和公式推导,终于到了 SMO 的算法实现以及最终的 SVM 分类实现了。那么现在就先看看 SMO 的 python 实现。

SMO python 实现

代码中的 αiαj 对应了前一篇中的 α1α2,并且代码中的计算方式都是套用前一篇中推导出来的公式,请仔细体会。另外,以下我把选出来的 αiαj 分别成为第一个 alpha 值和第二个 alpha 值。

首先定义一个核转换函数用于计算训练集矩阵(X)与任意给定样本矩阵间的核转换结果。

SVM系列之SMO的Python实现(四)

下面定义一个 SVMStruct 类来封装一些属性和方法,以便可以快速构建一个 SVM 模型。

SVM系列之SMO的Python实现(四)

接下来定义一些 SVMStruct 类下的辅助方法。

SVM系列之SMO的Python实现(四)

SVM系列之SMO的Python实现(四)

SVM系列之SMO的Python实现(四)

SVM系列之SMO的Python实现(四)

接下来,函数 innerL为 SMO 主程序内层循环的代码。

SVM系列之SMO的Python实现(四)

外层循环的代码:

SVM系列之SMO的Python实现(四)

计算权重 \(w\) 的函数:

SVM系列之SMO的Python实现(四)

分类函数的代码:

SVM系列之SMO的Python实现(四)

最后是 plot 出样本点,和划分线:

SVM系列之SMO的Python实现(四)

那么最后可视化的结果为:

SVM系列之SMO的Python实现(四)

  1. 本例中所用的数据集必须使用线性核才使得样本可分。
  2. 本文代码见个人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酱