1. 概述
支持向量机(Support Vector Machines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。
间隔最大化,就是所有样本点中,离我们分类界限超平面最近的样本点,尽可能的远离超平面。这种思想在于,不关心远离超平面的样本点,即分类很明确的样本,不作考虑,更关心离超平面近的样本点。这些离超平面较近的点对超平面的位置有着至关重要的影响,抓住这个主要矛盾来分析问题。从个体与整体的角度来看,当两边的离超平面较近的样本点都里超平面足够远时,那么其余的样本点也离超平面足够远。这时,满足间隔最大化的超平面,泛化能力最好。
2. 标题数学推导
所谓支持向量机,就是通过计算支持向量的最大间隔来确定唯一且泛化能力最好的超平面。
2.1 函数间隔
在分离超平面固定为
w
T
x
+
b
=
0
w^Tx+b=0
wTx+b=0的时候,
∣
w
T
x
+
b
∣
|w^Tx+b|
∣wTx+b∣表示点
x
x
x到超平面的相对距离。通过观察
w
T
x
+
b
w^Tx+b
wTx+b和
y
y
y是否同号,我们判断分类是否正确。这里我们引入函数间隔的概念,这个函数间隔就是我们样本的确信度,定义函数间隔
γ
′
\gamma^{\prime}
γ′为:
γ
′
=
y
(
w
T
x
+
b
)
\gamma^{\prime}=y(w^Tx+b)
γ′=y(wTx+b)
2.2 几何间隔
函数间隔并不能正常反应点到超平面的距离,当分子成比例的增长时,分母也是成倍增长。为了统一度量,我们需要对法向量
w
w
w加上约束条件,这样我们就得到了几何间隔
γ
\gamma
γ ,这个几何间隔在二维空间的理解,就是点到线的距离,几何间隔定义为:
γ
=
y
(
w
T
x
+
b
)
∣
∣
w
∣
∣
2
=
γ
′
∣
∣
w
∣
∣
2
\gamma=\frac{y(w^Tx+b)}{||w||_2}=\frac{ \gamma^{\prime}}{||w||_2}
γ=∣∣w∣∣2y(wTx+b)=∣∣w∣∣2γ′
2.3 支持向量机
分离超平面为 w T x + b = 0 w^Tx+b=0 wTx+b=0 ,如果所有的样本不光可以被超平面分开,还和超平面保持一定的函数距离。和超平面平行的保持一定的函数距离的这两个超平面对应的向量,我们定义为支持向量。
3 原理
3.1 硬间隔最大化
SVM的模型是让所有点到超平面的距离大于一定的距离,也就是所有的分类点要在各自类别的支持向量两边。用数学式子表示为:
max
γ
=
y
(
ω
T
x
+
b
)
∥
ω
∥
2
⋯
s.t.
⋅
y
i
(
ω
T
x
i
+
b
)
=
γ
′
(
i
)
≥
γ
′
(
i
=
1
,
2
…
,
m
)
\max \gamma=\frac{y\left(\omega^{T} x+b\right)}{\|\omega\|_{2}} \cdots \text { s.t. } \cdot y_{i}\left(\omega^{T} x_{i}+b\right)=\gamma^{\prime(i)} \geq \gamma^{\prime}(i=1,2 \ldots, m)
maxγ=∥ω∥2y(ωTx+b)⋯ s.t. ⋅yi(ωTxi+b)=γ′(i)≥γ′(i=1,2…,m)
m
m
m为训练数据集中样本个数。
经推到,得到SVM优化函数:
min
1
2
∥
ω
∥
2
2
⋅
s.t.
⋅
y
i
(
ω
T
x
i
+
b
)
≥
1
(
i
=
1
,
2
,
…
,
m
)
\min \frac{1}{2}\|\omega\|_{2}^{2} \cdot \text { s.t. } \cdot y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1(i=1,2, \ldots, m)
min21∥ω∥22⋅ s.t. ⋅yi(ωTxi+b)≥1(i=1,2,…,m)
由拉格朗日乘子法推导,得到最终约束优化函数:
min
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
−
∑
i
=
1
m
α
i
\min \frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} x_{i}^{T} x_{j}-\sum_{i=1}^{m} \alpha_{i}
min21i=1∑mj=1∑mαiαjyiyjxiTxj−i=1∑mαi
s.t.
∑
i
=
1
m
α
i
y
i
=
0
\text { s.t. } \sum_{i=1}^{m} \alpha_{i} y_{i}=0
s.t. i=1∑mαiyi=0
α
i
≥
0
,
i
=
1
,
2
,
…
,
m
\alpha_{i} \geq 0, i=1,2, \ldots, m
αi≥0,i=1,2,…,m
由序列最小化(sequential minimal optimization,SMO)算法求解 ,并求解法向量
w
w
w和偏置
b
b
b。由此得到最终分类超平面
w
∗
x
+
b
∗
=
0
w^{*} x+b^{*}=0
w∗x+b∗=0和决策函数
f
(
x
)
=
s
i
g
n
(
w
∗
x
+
b
∗
=
0
)
f(x)=sign(w^{*} x+b^{*}=0)
f(x)=sign(w∗x+b∗=0)。
3.2 软间隔最大化
与硬间隔最大化不同的是,软间隔最大化允许某些样本不满足约束条件,即SVM对训练集里面的每个样本
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi)引入了一个松弛变量
ξ
i
≥
0
\xi_{i} \geq 0
ξi≥0 ,使函数间隔加上松弛变量大于等于1。得到软间隔最大化SVM优化函数:
min
1
2
∥
ω
∥
2
2
+
C
∑
i
=
1
m
ξ
i
\min \frac{1}{2}\|\omega\|_{2}^{2}+C \sum_{i=1}^{m} \xi_{i}
min21∥ω∥22+Ci=1∑mξi
s.t.
y
i
(
ω
T
x
i
+
b
)
≥
1
−
ξ
i
(
i
=
1
,
2
,
…
,
m
)
\text { s.t. } y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1-\xi_{i}(i=1,2, \ldots, m)
s.t. yi(ωTxi+b)≥1−ξi(i=1,2,…,m)
ξ
i
≥
0
(
i
=
1
,
2
,
…
,
m
)
\xi_{i} \geq 0(i=1,2, \ldots, m)
ξi≥0(i=1,2,…,m)
这里,C>0为惩罚参数,可以理解为我们一般回归和分类问题正则化时候的参数。C越大,对误分类的惩罚越大,C越小,对误分类的惩罚越小。
3.3 核函数
存在线性不可分的样本,将样本从原始空间映射到一个更高维的特征空间,使得样本这个特征空间内线性可分。再通过间隔最大化的方式得到SVM,成为非线性SVM。
令φ(x)表示将x映射后的特征向量,在特征空间中划分超平面所对应的模型可表示为:
min
1
2
∑
i
=
1
,
j
=
1
m
α
i
α
j
y
i
y
j
ϕ
(
x
i
)
T
ϕ
(
x
j
)
−
∑
i
=
1
m
α
i
\min \frac{1}{2} \sum_{i=1, j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} \phi\left(x_{i}\right)^{T} \phi\left(x_{j}\right)-\sum_{i=1}^{m} \alpha_{i}
min21i=1,j=1∑mαiαjyiyjϕ(xi)Tϕ(xj)−i=1∑mαi
在高维空间直接计算
ϕ
(
x
i
)
T
ϕ
(
x
j
)
\phi\left(x_{i}\right)^{T} \phi\left(x_{j}\right)
ϕ(xi)Tϕ(xj)通常是困难的,为了避开这个障碍,设想一个函数:
K
(
x
i
,
x
j
)
=
⟨
ϕ
(
x
i
)
,
ϕ
(
x
j
)
⟩
=
ϕ
(
x
i
)
T
ϕ
(
x
j
)
K\left(x_{i}, x_{j}\right)=\left\langle\phi\left(x_{i}\right), \phi\left(x_{j}\right)\right\rangle=\phi\left(x_{i}\right)^{T} \phi\left(x_{j}\right)
K(xi,xj)=⟨ϕ(xi),ϕ(xj)⟩=ϕ(xi)Tϕ(xj)
函数
K
(
x
i
,
x
j
)
K\left(x_{i}, x_{j}\right)
K(xi,xj)就是核函数。
4. python实现
采用breast cancer二分类数据集,在sklearn库中调用svc函数svm分类。可以看出svm测试准确率优于感知机。
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 10 22:15:53 2020
@author: HP
"""
'''
breast cancer data ---- 569
data = 9个属性
target = 阴性----0,阳性-----1
'''
# 导入基本库
from sklearn.svm import SVC
from sklearn.linear_model import Perceptron
from sklearn import datasets
from sklearn.model_selection import train_test_split
#导入乳腺癌数据集
cancer = datasets.load_breast_cancer()
cancer_X = cancer.data#得到乳腺癌样本集
cancer_y = cancer.target#得到乳腺癌标签集
X_train,X_test,y_train, y_test=train_test_split(
cancer_X,cancer_y,test_size=0.2)#按照比例划分数据集为训练集与测试集
# 创建一个SVM分类器并进行预测
clf = SVC(kernel='linear', C=1)#创建SVM训练模型
clf.fit(X_train,y_train)#对训练集数据进行训练
clf_y_predict=clf.predict(X_test)#通过测试数据,得到测试标签
scores = clf.score(X_test,y_test)#测试结果打分
#创建一个感知机分类器并进行预测
clf1 = Perceptron()#创建感知机训练模型
clf1.fit(X_train,y_train)#队训练集数据进行训练
clf1_y_predict=clf1.predict(X_test)#通过测试集数据,得到测试标签
scores1 = clf1.score(X_test,y_test)#测试结果打分
#打印
print('SVM准确率:',scores)
print('感知机准确率:',scores1)
运行结果