---
# System prepended metadata

title: SVM算法原理

---

# SVM算法原理

支持向量机是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器，您可能会疑惑什么是线性可分，我们会介绍这一概念。

### 线性可分

在二维空间上，两类点被一条直线完全分开叫做线性可分。

![image-20210814103442794](https://i.loli.net/2021/08/14/wcLhplBMrkzTfyP.png)

它的数学定义是：D0和D1是n维欧式空间的两个点集。如果存在n维向量W和实数b, 使得所有属于D0的点XI都有
$$
\omega x_{i}+b>0
$$
而对于所有属于D1的点 $X$ 则有
$$
\omega x_{j}+b<0
$$
我们称D0和D1线性可分。
我们知道, 在一个平面当中, 能把两类点分开的直线可能有很多条, 如下图所示

![image-20210814103545703](https://i.loli.net/2021/08/14/l3RviDTc9MmHW7g.png)

对于淡蓝色的点，如果这些点到分类直线的距离越大，再产生的新点的特性如果与淡蓝色点相似, 也会与淡蓝色集合点 分布在同一则, 表明与淡蓝色集合点属于同一个晃别，分类更加精确。同理, 对于黑色点来说, 这条分类直线离他们的 距离也越远越好。了解这个概念之后, 我们能得到二维线性可分问题的目标函数：（关于目标函数的推导，我会放在附 录, 如果您感兴趣, 可以查看)
$$
\min _{\omega, b} d=\min _{\omega, b} \frac{1}{2}\|\omega\|^{2} \text { s.t. } y \cdot\left(\omega^{T} \cdot x+b\right) \geq 1
$$
# 核函数

1.线性核函数 (Linear Kernel)
$$
k\left(x, x_{i}\right)=x \cdot x_{i}
$$
主要用于线性可分的情况。在原始空间中寻找最优线性分类器，具有参数少，速度快的优势。通常，我们首先采用线性核函数先进行分类尝试。

2.多项式核函数 (Polynomial Kernel)
$$
k\left(x, x_{i}\right)=\left(\left(x \cdot x_{i}\right)+1\right)^{d}
$$
多项式核函数可以实现将低维的输入空间映射到高纬的特征空间, 属于全局核函数, 参数d越大, 映射的维度也越高, 计算量就会越大，容易出现 过拟合"的现急

3.高斯核函数 (Gaussian Kernel)
$$
k(x, y)=\exp \left(-\frac{\|x-y\|^{2}}{2 \sigma^{2}}\right)
$$
高斯核函数是一种局部性较强的函数，改函数是应用最广的一个，无论在大样本或者在小样本都有比较好的性能，且相对于多项式核函数来说参数更少。当数据点距离中心点变远时，取值会变小。高斯核函数对数据中存在的噪声有着较好的抗干扰能力，由于其很强的局部性，其参数决定了函数作用范围，随着参数σ的增大而减弱。

4.Sigmoid核函数（Sigmoid Kernel）
$$
k(x, y)=\tanh \left(a x^{T}+c\right)
$$


采用Sigmoid函数作为核函数时，支持向量机实现的就是一种多层感知器神经网络，该核函数被广泛运用于深度学习和机器学习中。

5.如何选择

吴恩达教授曾经给出过一系列的选择核函数的方法：

- 当样本的特征很多时，特征的维数很高，这是往往样本线性可分，可考虑用线性核函数的SVM或LR
- 当样本的数量很多，但特征较少时，可以手动添加一些特征，使样本线性可分，再考虑用线性核函数的SVM或LR。
- 当样特征维度不高时，样本数量也不多时，考虑用高斯核函数



# 代码示例

以鸢尾花数据集为例。

1.导入鸢尾花数据集

In [1]:

```
# 导入数据集
from sklearn import datasets
iris = datasets.load_iris()
```

2.划分数据集

In [2]:

```
# 数据集划分
from sklearn.model_selection import train_test_split
X = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
```

3.训练SVM分类器

In [3]:

```
# 训练SVM分类器
from sklearn import svm
S = svm.SVC(C = 1.0,kernel='rbf',decision_function_shape='ovr',gamma=0.01)
S.fit(x_train,y_train)
```

Out[3]:

```
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
```

#### 参数详解

对于svm的SVC参数，我们主要关注以下几个部分

1. C：惩罚参数，默认值为1。C越大，对**误**分类的惩罚增大，趋向于全部分对的状况，这样对
   训练集的测试率很高，但泛化能力较弱。C越小，对误分类的惩罚减小，允许容错，泛化能力较强。
2. kernel：核函数，默认值是rbf，也可以是'linear','poly','sigmid','precomputed'，不同的核函数对应有不同的参数，比如对于rbf，gamma就是他的参数，一般取1/n。如何选择kernel，则需要具体问题、具体分析。

4.显示分类器分类结果

In [4]:

```
# 显示分类器分类结果
print('训练：%.3f'%S.score(x_train,y_train))
print('测试：%.3f'%S.score(x_test,y_test))
```

训练：0.933
测试：0.933



# 作业

使用sklearn提供的SVM的API对手写数字数据集的数据进行预测，手写数字数据集使用方法如下:

In [5]:

```
from sklearn.datasets import load_digits
digits = load_digits()
```

# 参考来源

1. 《统计学习方法》 李航
2. https://www.cnblogs.com/fuqia/p/8963429.html
3. https://blog.csdn.net/sunflower_sara/article/details/81228112
   \# 附录

### 二维线性可分问题目标函数推导

点到直线的距离公式
$$
d=\frac{\left|A \cdot x_{0}+B \cdot y_{0}+C\right|}{\sqrt{A^{2}+B^{2}}}
$$
那么，对于wx+b=0的直线形式，有一个点x到该直线的距离公式为
$$
d=\frac{|\omega \cdot x+b|}{\sqrt{\omega \cdot \omega}}=\frac{|\omega \cdot x+b|}{\|\omega\|}
$$
对于二维线性可分，我们想要每个支持向量（样本中里超平面（这里是直线）距离最近的点）到直线的距离最大，即我们需要找到d的最大值
$$
\max _{\omega, b} d=\max _{\omega, b} \frac{|\omega \cdot x+b|}{\|\omega\|}
$$
接下来，我们对该公式进行下一步的简化

![image-20210814104218307](https://i.loli.net/2021/08/14/lse83UxmRMkFfbA.png)

在二维空间中，我们作wx+b=c以及wx+b=-c，满足这两条直线到wx+b=0的距离相等。对于一条直线wx+b=c，我们相同比例缩小系数，这条直线和原来的直线还是同一条直线。现在将他缩小为：
$$
\frac{\omega}{c} \cdot x+\frac{b}{c}=\frac{c}{c}=1
$$
我们发现，对于直线wx+b = c，我们可以找到w1=w/c，b1=b/c，使得w1*x+b1=1。

![image-20210814104250054](https://i.loli.net/2021/08/14/gB8pQj2b3uzZXfn.png)

将该结果代入，我们可以抽象出目标函数
$$
\max _{\omega, b} d=\max _{\omega, b} \frac{1}{\|\omega\|}
$$
同时, 该函数应该满足以下约束:
$$
\left\{\begin{array}{l}
\omega^{T} \cdot x+b \geq 1 x \text { 是淡蓝色点 } \\
\omega^{T} \cdot x+b \leq-1 x \text { 是黑色点 }
\end{array}\right.
$$
即:
$$
\max _{\omega, b} d=\max _{\omega, b} \frac{2}{\|\omega\|} \text { s.t. } y \cdot\left(\omega^{T} \cdot x+b\right) \geq 1
$$
我们对他做一个转换取倒数可得
$$
\min _{\omega, b} d=\min _{\omega, b} \frac{1}{2}\|\omega\|
$$
为方便计算，我们可以得到:
$$
\min _{\omega, b} d=\min _{\omega, b} \frac{1}{2}\|\omega\|^{2}
$$
