「机器学习算法的数学解析与Python实现」支持向量机分类算法

SVM:线性分类器的“王者”

支持向量机兼具形式优美和高效好用,受到学术界和工业界的一致好评。

支持向量机中的三个重要概念:

  • 最大间隔
  • 高维映射
  • 核方法

距离是不同类别的天然间隔

在分类的时候,为了提高鲁棒性,我们需要给正负类两边都多留点空间,使得分割线距离两边都达到最大间隔。

何为“支持向量”

支持向量机(Support Vector Machine)中一个重要的概念叫“支持向量”,这也是该算法名字的由来。

“间隔”实际是通过两侧的样本点划分而成,这些样本点就是“支持向量”。

「机器学习算法的数学解析与Python实现」支持向量机分类算法

支持向量机的目标就是让间隔最大化

间隔分为两种:

  • 硬间隔:间隔的一边只有一类样本;
  • 软间隔:间隔的一边允许存在少数的其他类别的样本;

从更高维度看“线性不可分”

在很多情况下,不同类别的数据是混杂在一起的,无法用线性加以区分,术语上称为“线性不可分”。对于线性不可分的情况,怎么用线性方法分割呢?SVM通过引入高维映射来解决这个问题。

数学上有一种解决新难题的思路:

  1. 将新问题转化为已经解决的旧问题;
  2. 通过老方法加以解决。

按照这个思路,我们要解决的问题就是,怎样将线性不可分变得线性可分,然后再按照老办法寻找最大间隔。

线性不可分只是在当前的维度下线性不可分,但如果增加了维度,原本不可分也就可分了。

经过高维映射后,二维分布的样本点变成了三维分布

「机器学习算法的数学解析与Python实现」支持向量机分类算法

SVM分类的算法原理

基本思路

1.最大间隔

SVM以“间隔”作为损失的度量,通过不断调整超平面,使得间隔最大化。实际是就是一种换了损失函数的线性方法。

“支持向量”,就是所有数据点中直接参与计算使得间隔最大化的几个数据点。

2.高维映射

通过增加维度,使得非线性分布出现了线性可分的差异,从而达到分离正负类的目的。

3.核函数

能够在SVM中完成高维映射功能的函数都称为核函数。不论哪种核函数,其最根本的目的就是完成高维映射,具体两项工作:

  1. 增加空间的维度;
  2. 完成对现有数据从原空间到高维空间的映射。

在一次SVM的学习过程中,需要首先设置好选择哪种数学函数作为核函数。

4.SVM的真正运行机制

真正的SVM由间隔最大化高维映射两大部分组成,间隔最大化是目标,间隔作为度量分类效果的损失函数,高维映射用于解决线性不可分问题。

使用SVM进行分类经过三个步骤:

  1. 选取核函数;
  2. 使用核函数进行高维映射,数据点由原本的线性不可分变成线性可分;
  3. 间隔最大化,用间隔作为度量分类效果的损失函数,最终找到使得间隔最大化的超平面,分类也就完成了。

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\|}\) :

「机器学习算法的数学解析与Python实现」支持向量机分类算法

我们的目标是间隔最大化,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分类算法信息表

「机器学习算法的数学解析与Python实现」支持向量机分类算法

使用SVM的三个步骤:

  1. 选择核函数。
  2. 核函数完成高维映射并计算间隔。
  3. 使用SMO等优化算法使得间隔最大化。

在Python中使用SVM分类算法

支持向量机算法族都在sklearn.svm包中,其中不同的类只是在核函数上不同,以及用于解决不同的问题,包括分类问题、回归问题和无监督学习中的异常检测,具体为:

  • LinearSVC类:基于线性核函数的支持向量机分类算法。
  • LinearSVR类:基于线性核函数的支持向量机回归算法。
  • SVC类:可选择多种核函数的支持向量机分类算法,通过“kernel”参数可以传入“linear”选择线性函数、传入“polynomial”选择多项式函数、传入“rbf”选择径向基函数、传入“sigmoid”选择Logistics函数作为核函数,以及设置“precomputed”使用预设核值矩阵。默认以径向基函数作为核函数。
  • SVR类:可选择多种核函数的支持向量机回归算法。
  • NuSVC类:与SVC类非常相似,但可通过参数“nu”设置支持向量的数量。
  • NuSVR类:与SVR类非常相似,但可通过参数“nu”设置支持向量的数量。
  • OneClassSVM类:用支持向量机算法解决无监督学习的异常点检测问题。

本章介绍的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使用间隔进行分类,因此只适合于二分类问题。

SVM分类算法特点

「机器学习算法的数学解析与Python实现」支持向量机分类算法

上一篇:【机器学习】基于LIBSVM实现支持向量机核函数训练并获取决策函数


下一篇:python执行SVM分类