支持向量机SVM的翻译为Support Vector Machine,但是实际上跟machine机器没有什么关系,只是起了个这个名字。SVM是1963年提出了,提出之后就得到了非常广泛的应用,因为它是做监督分类的一个非常好的手段。搓搓手一起来学习吧~~
好的分割线
什么才是好的分割线?如果是下面这样的样本集合那么答案很简单,“/”这样的一条线就是最好的分割线
那么如果现在给你的是这样的一个数据集,那么哪个分割线你会觉得更好呢?
我想你的答案就是中间那条“|”线,这个金箍棒在哪里?棒就棒在在它最大化了到临近点的距离,这个距离就叫做间隔(Margin)
为什么距离最远就是最好的,那么我们现在想象一个距离左边红色数据很近的一条分割线,那么只要右偏一点点的数据就要被分类到右边的蓝色区域,这样的划分是不合理,不稳定的。而最大化距离,保证了稳定性,我们叫做稳健性(Robustness)
还需要注意的一点是,对于下图的分类,我们应该选择①②③的哪一条作为分割线呢?
答案是②,因为SVM首先要保证分类的正确性,然后才是距离最大,如果只考虑距离最大,那岂不是③是一条更好的分类?
此外,SVM对于异常值的处理也是很好的,下图的情况存在一个异常值,那么SVM算法会忽略异常值,然后找到最好的分割线
不同于朴素贝叶斯的决策面,SVM的分割线是一条直线,而朴素贝叶斯却可以是一条弯曲的线(或者面)
Quiz
知道了SVM的工作原理,我们可以访问SVM scikit-learn页面来查看代码,然后做一个小小的练习。练习的内容非常简单,如果你还记得[机器学习]一看就懂的教程:朴素贝叶斯中的无人车的例子,那么这个练习就是把算法由朴素贝叶斯改为支持向量机。
非线性SVM
前面我们提到了,SVM是基于线性的划分,那么下面这张图我要告诉你,都是SVM的分类,为什么左边是线性的,右边是非线性的呢?
根据之前的我们对于SVM的认识,下图的数据有两个features(x和y),然后有一个Lables(颜色),这个图其实很难用一条直线来进行划分。假如我们还是想用SVM的方法用一条直线划分,该怎么操作呢?
不妨看看这个办法,设置一个新的变量z
z=x^2 + y^2
再画出x和z的坐标,竟然得到了下图的图形,红色的x和蓝色的o都被分开了,可以用直线来划分了!!
再来做一个简单的练习,下面的图该如何分类呢?
答案选第二个:|x|
核技巧Kernels
或许接触过机器学习的人很早就听说过核技巧这个概念,核技巧到底是干什么的?有了我们之前的例子,你应该就明白了,Kernels就是实现非线性分割线对数据集的分类。,这个技巧是机器学习当中非常重要的一个技巧。
现在让我们深入了解一下kernel的代码,打开scikit-learn svm的页面,可以看到这里面定义了非常多的参数,其中有一个参数就叫做kernel,你可以选择不同的kernel,如果不选择,默认就是“rbf",可以画出弯弯曲曲的决策边界
我们在使用Kernel的时候,有两个重要的参数:gamma和C
gamma的作用(这个我还没有太搞懂),大概就是我们的把数据映射到新的特征空间之后,gamma大的话,新的数据形成的正态分布σ就小,那么数据就比较集中。
C的作用:在尽可能的形成一个光滑的决策边界和尽可能正确的分类所有训练点之间形成的平衡,C越大,那么就会有更多的数据被正确分类,也就是容错率越低。如图所示
SVM的优缺点
SVM对于具有明显分隔边界的复杂数据的表现是非常好的,但是对于海量的数据,SVM就不适用了,因为训练时间与数据量的三次方成正比。而且,如果类之间的重叠较多,需要将不同的类分开来,用朴素贝叶斯反而更好
更多的内容,欢迎关注我的知乎专栏哟~?