SVM算法杂谈(附代码实现)

前言
SVM算法确实有难度,我感觉没有两三遍学习,是很难彻底掌握的,这是我第一遍学习时的理解与体会,有瑕疵的地方还望海涵,日后会再更新(SVM算法的数学原理很多也很复杂,本文不作深入介绍,仅在需要的时候提一下)。
一、算法简介
SVM算法,全称是支持向量机算法,是一个二分类机器学习算法,也是目前分类效率最高以及泛化性能最好的算法,不过以此同时也是理论最深、实现起来最复杂的算法。
为什么叫支持向量机呢,这是因为对该算法来说,起作用的是支持向量(即离超平面最近的向量,后面会提到)之所以成为“机”是因为算法产生的是一个二值分类决策的结果。
二、SVM的版本
通常来说,SVM有三个不同的应用版本,即线性可分支持向量机、线性向量机、线性不可分向量机。三种算法实现的难易程度以次递增。
线性可分,即我们可以找到一条线性直线(二维空间),将数据集的类别给分开,这是最完美的一种情形,这种划分机制是硬最大间隔。如果是高维空间,直线将表现为超平面。线性,即通常来说,数据并不是那么完美的,不可能随便一条直线就能轻易分割开来,总有一点瑕疵和一些“不入群”的数据,这个时候,我们可以引入一个松弛变量C,允许数据在C内存在分类误差,然后仍按按照线性可分的情形来处理。线性不可分是前两者的一个升级版,即找不到线性的直线可以将数据集分割开来。这样的话,我们还有办法按照线性可分的那种方式来处理数据吗?答案是肯定的,只不过提前需要做一些预处理–核函数。后面再重点讲解核函数的作用。
三、SVM算法思想
先简单介绍这三种版本的实现机制,最后总结一下算法的本质。
1、线性可分支持向量机
这是SVM最简单的一个版本,实现机制采用的是硬最大间隔划分数据。具体来说,是寻找那些距离超平面最近的向量(即支持向量),然后让这些向量离超平面的距离最远化,即为我们要求解的算法结果。听起来可能有点拗口,通俗点来说,对于一个输入空间来说,输入的向量可能有很多很多,但最后能影响算法的也只有那些离超平面距离最近的支持向量(这也是为什么成为支持向量机的缘故),我们要做的就是找一个超平面,让它离支持向量的距离最远,因为越远的话,分类正确的可能性就越高。算法最后求解的是含有约束条件的凸二次规划问题。
2、线性支持向量机
当版本1的数据不是那么完美时,我们可以引入一个松弛变量,然后按照近似线性的方式来处理,这种机制成为软最大间隔,与硬是相对应的。思想与1完全类似,唯一不同的是需要求解的凸二次规划表达式不同而已。
3、线性不可分支持向量机
当数据很复杂时,实在无法直接按照线性可分的情况来处理,这个时候我们可以引入核函数转化一下,然后再按照线性可分来处理,算法的思想与前面完全一样,唯一需要特别说明的是核函数的思想。
核函数,它本质上是一个函数映射,将低维的输入空间映射到高维的特征空间中,然后再特征空间中求解,最后再将结果返回到低维空间。因为直观上来说,我们在低纬无法区分的数据,在高维可能就是可分的,这也是引入核函数的前提。
引入核函数还有一个优点就是,可以简化数据集的计算复杂度,提高算法运行速度,因为我们只需要关注向量的内积就OK了。
总结:这三个版本的SVM,其思想完全一样,只不过针对不同的数据集分布情况,提出了不同的解决措施。SVM算法的本质,都是将分类问题,最后转化为一个带有约束条件的优化问题(即凸优化),本质上来说是数学问题,关于求解这个凸优化问题的步骤以及KKT优化前提条件,这里不做深入介绍,有兴趣的可以参考其他资料,目前我对自己的要求是,会用算法能解决实际问题即可,暂时不考虑算法背后的数学原理。
看到一篇不错的知乎,有推导过程,用兴趣的可以看一下。
https://zhuanlan.zhihu.com/p/32152421
四、SVM算法的实现
SVM算法的理论基础特别深,则算法实现起来肯定也是极其复杂的,没错,事实上确实很复杂。传统SVM算法实现,效率极其低下,很难应付数据集规模较大的情况,幸运的是有大牛Platt发明了一种SMO实现算法,即序列最小最优算法。算法基本思想是这样的:通常来说,我们求解一个规模比较大的问题的时候,计算代价是很大的,SMO算法呢,是把规模较大的数据集,拆开来,每次求解其中两个向量,然后得到一个优化后的向量,再以次两两求解剩余的向量,直到没有可被优化的向量为止。最后利用得到的一系列的alpha,我们很容易求得我们需要的超平面。我姑且将SMO算法策略理解为分治的思想,大而化小,先对小规模数据集求解,然后利用得到的结果再求解,就能得到我们最终需要的超平面。当然这只是SMO算法的皮毛,详细理解还是需要参考论文,这里推荐一篇A;十分经典的论文 Improvements to Platt’s SMO Algorithm for SVM Classfier Design
算法实现的完整代码太多了,我已经上传到我的github仓库上面了,并根据自己的理解做了注释,需要的请参考 :https://github.com/GritCoder/SVM

至此,机器学习的分类算法介绍的差不多了(当然还有其他的以及对以上算法的优化版本,读者有兴趣可自行查阅资料),接下来将介绍回归算法和聚类(标记)算法,最后介绍机器学习中需要用到的数学原理和相关的优化知识。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值