从零开始实现简单的SVM分类器

从零开始实现简单的SVM分类器

从零开始实现简单的SVM分类器

Zhenghao Fei

Zhenghao Fei

大农村老伯

26 人赞同了该文章

相信学习过机器学习的人一定不会没有听过支持向量机SVM,SVM自从出现以来一直是非常受欢迎的一种分类器,他具有非常多的优势,理论证明严谨,可以将低维度线性不可分割的问题投影到高维度去解决等等,直到近些年才稍稍在某些领域被神经网络盖过风头。但是SVM依然天生具有训练速度快的优势。

我的学习路径比较奇怪,第一次见到SVM是在做深度学习的时候看到有使用SVM最为最后一层来对全连接网络层的输出处理进行图片类别分类,那时候竟然误以为SVM已经是只能给深度神经网络在最后打打杂的明日黄花,也一直以为这个用HyperPlane来分类的分类器只能处理线性可分问题,还记得和朋友去Fremont吃羊肉串的路上听到他说正学SVM,我不知深浅的数落了SVM一路。还好他那时候还没深学不然肯定被鄙视回来哈哈哈。

这个秋学期开始系统的学机器学习,又一次开始认真的接触到SVM,才发现完全和脑海中中的不一样,学过几节课后印象最深的两点一是SVM背后数学忒烦,第一遍听完课简直听了什么都不知道,但也正因此SVM非常的严谨,当开始能够理解的时候会发现这个东西会给你一种可控感。第二点是对将原本低维度线性不可分的数据投影到高维度变成线性可分,看到的第一眼觉得非常神奇,还特么能这么搞的?Kernel的引入还极大的加大了处理高维度的效率。

因为上课根本没看懂老师在黑板上的天书是啥以及听到了各种之前从没接触过的数学优化概念所以上完课是一脸懵逼的。回家上网搜索资料再自己好好看一遍之后才稍有缓和,在此大力推荐Andrew Ng的机器学习课程笔记,我主要看了其中涉及到SVM的笔记和SMO算法实现方法:

http://cs229.stanford.edu/notes/cs229-notes3.pdf
http://cs229.stanford.edu/materials/smo.pdf

不知不觉写了一堆废话,我们切入正题。SVM的课后作业是使用SVM对电子笔手写数字做1-9的分类识别,不能使用已经有的SVM库所以需要自己从零开始手写,允许使用 Quadratic program solver一类的已有库,但是因为使用了自己写的SMO算法,所以也并没有依赖QP Solver, 算是从零开始写了一遍完整的SVM吧,在此将其记录下来分享,查到的资料大多是教你理论和怎么使用库,希望能对自己想实现一遍的人有所帮助。

本文的公式截图引用自Andrew Ng的上述课程笔记

基础的SVM理论请参考上面第一篇笔记,本文重点讲实现。


1. 优化问题推导

在SVM中,我们通过计算下式来进行二项分类:

当f(x) >= 0 时 y = 1, 当f(x) <0 时 y = -1.

利用Dual可以将其表达成以下内积的形式:

其中<x^{(i)}, x >可以用KernelK<x^{(i)}, x >来代替,为我们开启了使用Kernel的可能性。

包含Regularization的形式的话,我们要解决的是以下这一个优化问题:

解决这个问题除了使用Quadratic program solver之外还可以从Lagrange multipliers的角度去思考,上述的优化问题可以转化为以下的Lagrangian:

求出该问题的Dual:

该Dual的 KKT 条件是:


2. SMO算法解上述优化问题

我们通过一个简化版本的SMO(sequential minimal optimization)算法来求\alpha 和 b 能使上述的Dual最小化, 从而实现目标函数的最小化。

关于SMO算法的完整版本可以参考JC Platt 的论文(微软原文网站竟然挂了,只能找到一本教材中的章节)

http://www.cs.utsa.edu/~bylander/cs6243/smo-book.pdf

2.1 选择要调整的\alpha

SMO的理念是我们可以通过每次调整一对\alpha_i,\alpha_j假设其他参数都是固定来不断的优化函数,直到最后收敛,完整版本的SMO算法中有怎样最优化的选择i,j的方法,但是现在我们做的只是随机的选取,并不能保证效率和最后收敛,不过在大部分情况下依然能够使用,适合于学习,通过反复迭代后接近收敛。

2.2 优化\alpha_i,\alpha_j

所有的\alpha都被初始化为0, 随机选取一对\alpha_i,\alpha_j,按照以下的方式做更新

2.2.1 计算\alpha_i,\alpha_j上下限:

2.2.1 更新\alpha_i,\alpha_j
 

2.3 计算b

3. Pseudo-Code

3. Python Code

SMO Algorithm:

CS271_SVM/svm.py at master · ZhenghaoFei/CS271_SVM · GitHub

使用的Kernel可以在以下文件找到:

CS271_SVM/lib.py at master · ZhenghaoFei/CS271_SVM · GitHub

之后有时间还会添加更新Multi Class SVM 和 One Class SVM的部分,祝大家学习生活愉快啦!

猜你喜欢

转载自blog.csdn.net/special00/article/details/89405654