支持向量机(SVM)

来源:互联网 发布:javascript常用事件 编辑:程序博客网 时间:2024/05/20 04:12

SVM全称为 support vector machine

粗略的来说支持向量机就是去寻找两个两个数据之间的分割线,以此来区分不同数据。

间隔:margin

对于支持向量机来说margin是距离左右两侧之间点的距离。如图所示:

这里写图片描述

这条线使与它最近的点之间距离最大化。

对于两个分类来说,这条线最大化了与左右两侧分类点的最大距离。这种距离称之为间隔:margin。他是最大化的产物。

这样划分的好处是可以最大限度的提升支持向量机的稳定性:robust,不会因为微小的噪声而出现较大的偏差。

这里写图片描述

注意不要犯这样的错误:

这里写图片描述

如图所示,箭头所指的线的划分才是正确的划分。支持向量机总是将正确分类标签作为首要考虑,然后才是对间隔最大化。另一个划分虽然实现了间隔最大化,但是错误的把红色划分到了蓝色里面了。

SVM对异常值的响应

遇到这样的异常值时SVM会怎样处理呢?

这里写图片描述

事实上SVM可以对这样的异常值进行处理,解决的办法不是抛弃异常值,而是这样:

这里写图片描述

它可以找到使两个分类间距最大的决策边界,同时允许单个异常值,就像图片中显示的。

训练SVM

features_train, labels_train, features_test, labels_test = makeTerrainData()from sklearn.svm import SVCclf = SVC(kernel="linear")clf.fit(features_train,labels_train)# 返回给pred的是一个列表pred = clf.predict(features_test)

非线性

看前面的划分我们知SVM是按照线性进行划分的,那么如何划分出非线性呢?

如图所示:

这里写图片描述

左边的数据如果要分类的话那么是非线性的,但我们可以进行处理,不按照x和y来处理数据。令z=x^2+y^2,那么z就表示距离原点的距离的平方,我们舍弃y,绘制x和z的图像,如右图,这样就把非线性的问题转化为线性。

别的样子分割同理

这里写图片描述

核技巧

为了解决上述问题,我们发明了核技巧。他是一个将低维空间映射到高维空间的函数。这样过去不可以线性分割的东西就变得可以线性分割了。这些函数称之为核函数。

这里写图片描述

显然,核是有很多种的,那么如何选择核呢?

事实上一些基本的核可以拿来即用,一些个性化的核只能自己编写。

SVC中提供的kernel有:linear,poly(多项式),rbf(径向基函数),sigmoid(S型的函数),precomputed和callable

SVM的C参数

他的作用是控制光滑决策边界,并且对分类训练的点取一个折中。

什么意思呢?

如图所示:

这里写图片描述

这样的数据,如果取得分类线非常的直,会导致一些信息被错误的归类,如果取得分类线非常的弯曲,会导致泛化能力不够,也就是说不一定适用于所有的数据。C参数在这里就是取一个折中。

那么一个更大的 C 会让边界更平滑还是得到更多正确的训练点?

事实上是,当C值较大时你会得到更多的训练的点,实际是当C值较大时你会得到一个较为复杂的决策边界。它可以弯曲绕过所以单独的数据点,尽可能让所有的东西都正确。代价就是会比较复杂。

这里写图片描述

过拟合

出现这种奇奇怪怪的图像而不是那种线性图像的时候就是过拟合,我们应当尽量避免过拟合。

这里写图片描述

支持向量机的优缺点

支持向量机在具有复杂领域和明显的分割边界的情况下表现的非常出色,但是在海量的数据集中就表现得不是很好。因为在这种数据集中训练的时间将是立方数。

另外在噪声过多的情况下,效果也不好。

所以如果类类严重的重叠,你需要考虑独立evidence,这时朴素贝叶斯分类器会更有效。

对于文本学习而言,朴素贝叶斯要比支持向量机好很多。