vlambda博客
学习文章列表

线性支持向量机的那些事儿

点击菜单栏“粉丝福利”

拿小度,兑手机!

作者:刘凯旋 来源:人工智能学习圈  本文未经授权,严禁转载,转载请联系作者本人。

支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术。尽管现在 Deep Learning 很流行,SVM 仍然是一种很有的机器学习算法,在数据集小的情况下能比 Deep Learning 取得更好的结果。

线性支持向量机的那些事儿
先看下线性可分的二分类问题。
线性支持向量机的那些事儿
上图中的(a)是已有的数据,红色和蓝色分别代表两个不同的类别。数据显然是线性可分的,但是将两类数据点分开的直线显然不止一条。
上图的(b)和(c)分别给出了B、C两种不同的分类方案,其中黑色实线为分界线,术语称为“决策面”。每个决策面对应了一个线性分类器。虽然从分类结果上看,分类器A和分类器B的效果是相同的。但是他们的性能是有差距的,看下图:

线性支持向量机的那些事儿
又添加了一个红点。
可以看到,分类器B依然能很好的分类结果,而分类器C则出现了分类错误。显然分类器B的"决策面"放置的位置优于分类器C的"决策面"放置的位置,SVM算法也是这么认为的,它的依据就是分类器B的分类间隔比分类器C的分类间隔大。
Support Vector Machine(SVM)这个名字从何而来?为什么把这种分类面解法称为支持向量机呢? 这是因为分类面仅仅由分类面的两边距离它最近的几个点决定的,其它点对分类面没有影响。决定分类面的几个点称之为支持向量(Support Vector),好比这些点“支撑”着分类面。而利用Support Vector得到最佳分类面的方法,称之为支持向量机(Support Vector Machine)。
线性支持向量机的那些事儿

与其它线性分类器的关系:SVM是一个广义线性分类器,通过在SVM的算法框架下修改损失函数和优化问题可以得到其它类型的线性分类器,例如将SVM的损失函数替换为logistic损失函数就得到了接近于logistic回归的优化问题。
SVM和logistic回归是功能相近的分类器,二者的区别在于logistic回归的输出具有概率意义,也容易扩展至多分类问题,而SVM的稀疏性和稳定性使其具有良好的泛化能力并在使用核方法时计算量更小
定义(线性可分支持向量机):给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到一个分离超平面:
线性支持向量机的那些事儿
即相应的决策模型:
线性支持向量机的那些事儿
此模型就为线性可分支持向量机
以下的 Scikit-Learn 代码加载了内置的鸢尾花(Iris)数据集,缩放特征,并训练一个线性 SVM 模型
线性支持向量机的那些事儿
作为一种选择,你可以在 SVC 类,使用SVC(kernel="linear", C=1),但是它比较慢,尤其在较大的训练集上,所以一般不被推荐。
另一个选择是使用SGDClassifier类,即SGDClassifier(loss="hinge", alpha=1/(m*C))。它应用了随机梯度下降(SGD 见第四章)来训练一个线性 SVM 分类器。尽管它不会和LinearSVC一样快速收敛,但是对于处理那些不适合放在内存的大数据集是非常有用的,或者处理在线分类任务同样有用。
SVM算法是一个很优秀的算法,在集成学习和神经网络之类的算法没有表现出优越性能前,SVM基本占据了分类模型的统治地位。目前则是在大数据时代的大样本背景下,SVM由于其在大样本时超级大的计算量,热度有所下降,但是仍然是一个常用的机器学习算法。
  • 解决高维特征的分类问题和回归问题很有效,在特征维度大于样本数时依然有很好的效果。

  • 仅仅使用一部分支持向量来做超平面的决策,无需依赖全部数据。

  • 有大量的核函数可以使用,从而可以很灵活的来解决各种非线性的分类回归问题。

  • 样本量不是海量数据的时候,分类准确率高,泛化能力强。


参考:
https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html
https://www.jianshu.com/p/3938e0f22692
原文链接:https://zhuanlan.zhihu.com/p/152668536


线性支持向量机的那些事儿