支持向量机兼具形式优美和高效好用,受到学术界和工业界的一致好评。
支持向量机中的三个重要概念:
在分类的时候,为了提高鲁棒性,我们需要给正负类两边都多留点空间,使得分割线距离两边都达到最大间隔。
支持向量机(Support Vector Machine)中一个重要的概念叫“支持向量”,这也是该算法名字的由来。
“间隔”实际是通过两侧的样本点划分而成,这些样本点就是“支持向量”。
支持向量机的目标就是让间隔最大化。
间隔分为两种:
在很多情况下,不同类别的数据是混杂在一起的,无法用线性加以区分,术语上称为“线性不可分”。对于线性不可分的情况,怎么用线性方法分割呢?SVM通过引入高维映射来解决这个问题。
数学上有一种解决新难题的思路:
按照这个思路,我们要解决的问题就是,怎样将线性不可分变得线性可分,然后再按照老办法寻找最大间隔。
线性不可分只是在当前的维度下线性不可分,但如果增加了维度,原本不可分也就可分了。
经过高维映射后,二维分布的样本点变成了三维分布
1.最大间隔
SVM以“间隔”作为损失的度量,通过不断调整超平面,使得间隔最大化。实际是就是一种换了损失函数的线性方法。
“支持向量”,就是所有数据点中直接参与计算使得间隔最大化的几个数据点。
2.高维映射
通过增加维度,使得非线性分布出现了线性可分的差异,从而达到分离正负类的目的。
3.核函数
能够在SVM中完成高维映射功能的函数都称为核函数。不论哪种核函数,其最根本的目的就是完成高维映射,具体两项工作:
在一次SVM的学习过程中,需要首先设置好选择哪种数学函数作为核函数。
4.SVM的真正运行机制
真正的SVM由间隔最大化和高维映射两大部分组成,间隔最大化是目标,间隔作为度量分类效果的损失函数,高维映射用于解决线性不可分问题。
使用SVM进行分类经过三个步骤:
5.核技巧
SVM中涉及“核”的术语有三个,分别是核函数、核方法(Kernel Method)和核技巧(Kernel Trick)。
核技巧主要是提高核方法的计算效率。
1.点到超平面的距离
SVM间隔的定义,就是作为支持向量的点到超平面的距离的和。
点到三维平面的距离为:
\[d = \frac{|Ax_0 + By_0 + Cz_0 + D|}{\sqrt{A^2+B^2+C^2}} \]点到N维超平面(\(wx^{(i)}+b\))的距离为:
\[\gamma^{(i)} = \frac{w^Tx^{(i)} + b}{\|w\|} \]2.间隔最大化
间隔距离表示为 \(\frac{2}{\|w\|}\) :
我们的目标是间隔最大化,2只是一个常数,所以间隔最大化可以表示如下:
\[\max \frac{1}{\|w\|} \quad s.t., y_i(w^Tx_i +b) \ge 1, \quad i=1,\cdots,n \]\(s.t.\) 表示subject to,意思是收到约束,即“在......的条件下”。
后面那些式子都看不懂,先不管
SVM分类算法信息表
使用SVM的三个步骤:
支持向量机算法族都在sklearn.svm
包中,其中不同的类只是在核函数上不同,以及用于解决不同的问题,包括分类问题、回归问题和无监督学习中的异常检测,具体为:
本章介绍的SVM分类算法可通过SVC
类实现,使用如下:
from sklearn.datasets import load_iris # 导入SVM算法 from sklearn.svm import SVC # 鸢尾花数据集 X, y = load_iris(return_X_y=True) # 训练模型 clf = SVC().fit(X, y) # 预测结果 clf.predict(X)
预测结果如下:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
性能得分如下:
0.9866666666666667
查看使用的核函数:
# 查看核函数 clf.kernel
默认为径向基rbf:
'rbf'
分类采用“支持向量”,训练不需要使用全部数据,在小样本分类问题上有较好表现。原始的SVM使用间隔进行分类,因此只适合于二分类问题。
SVM分类算法特点