0.前言
自学机器学习有一段时间了,一开始看到吴恩达老师《机器学习》课程SVM部分不是很理解就先搁置下来,现在毕设拿CNN做的差不多了,看到很多研究借助SVN与CNN相结合的方式获得了更好的效果,所以折腾回来想把这一部分解决掉。
一开始看了网上很多帖子都是基于二维空间点到直线距离分析的,弄得我云里雾里,后来仔细想想列举原因如下:
(1)公式术语过多,一篇文章一个符号习惯,看着晕
(2)叙述比较偏理论,没有和工程应用有机结合起来。
要知道在框架语言(tensorflow甚至MATLAB)里面对于优化问题往往直接一个优化器搞定,深入搞懂每个优化器背后的原理费时费力,没俩礼拜你就忘了。相比之下我认为直接站在优化器想要什么效果的角度去思考更有利于实际编程。
于是温故知新,自己又回去把《机器学习》的SVM章节好好看了一遍,结合我自己在工程上的实践经验也有了一些新的理解。
1.SVM的目的是什么?
为方便起见这里假设一个只有2个特征(x1和x2)和2个类别的分类任务,如下图:
现在我们想找到一条线把这两个类别分开,下图中提供了几条直线让你选择,你肯定想选择绿色那条,因为看着最舒服、最标准。
没错,SVM设计的目的就在于此:光正确分类还不够,你还得分的标准。
现在问题来了,怎么找到这条“完美边界”?接下来就不得不引入支持向量的概念了。
我们单拎出来看绿线,假设它就是最完美的分界线,那我们认为在分类任务中,这条线就有一个重要性质:两侧所有离自己最近的点,距离最大。(PS:如果你问为什么这样规定,不妨找上一张图里其他两条线拿来试试,看它们两侧最近的点,距离有绿线大吗)