给大家介绍两款超级牛逼的算法!SVM · SMO算法!和牛逼也很难 !
KKT 条件
先来看如何选取参数。在 SMO 算法中,我们是依次选取参数的:
选出违反 KKT 条件最严重的样本点、以其对应的参数作为第一个参数第二个参数的选取有一种比较繁复且高效的方法,但对于一个朴素的实现而言、第二个参数即使随机选取也无不可
可以以一张图来直观理解这里提到的诸多概念:
(画得有点乱,见谅……)
图中外面有个黑圆圈的其实就是传说中的“支持向量”,其定义会在文末给出
那么我们到底应该如何刻画“违反 KKT 条件”这么个东西呢?从直观上来说,我们可以有这么一种简单有效的定义:
得益于 Numpy 强大的 Fancy Indexing,上述置 0 的实现非常好写(???):
至于 SMO 算法的第二步,正如前文所说,它的本质就是一个带约束的二次规划,虽然求解过程可能会比较折腾,但其实难度不大。具体步骤会放在文末,这里就暂时按下
SMO 的效果
仍是先看看螺旋线数据集上的训练过程:
略显纠结,不过还是不错的
接下来看看蘑菇数据集上的表现;单就这个数据集而言,我们实现的朴素 SVM 和 sklearn 中的 SVM 表现几乎是一致的(在使用 RBF 核时),比较具有代表性的训练曲线则如下图所示:
也算是符合 SMO 这种每次只取两个参数进行更新的训练方法的直观
(虽然这些在 Python · SVM(二)· LinearSVM 中介绍过,不过为了连贯性,这里还是再介绍一遍)
于是,最优解自然需要满足这么个条件:
至此,SVM 算法的介绍就大致告一段落了。我们从感知机出发,依次介绍了“极大梯度法”、MBGD(Batch 梯度下降)法、核方法和 SMO 算法;虽然都有点浅尝辄止的味道,但覆盖的东西……大概还是挺多的
希望观众老爷们能够喜欢~
进群:125240963 即可获取数十套PDF哦
上一篇: 建立文件交换功能的脚本(一)
下一篇: 一个简单的PHP入门源程序