ML 支持向量机SVM
1.概述
给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D = \{ (x_1,y_1), (x_2,y_2),..., (x_m,y_m) \} D={(x1,y1),(x2,y2),...,(xm,ym)}, y i ∈ { − 1 , + 1 } y_i \in \{ -1, +1 \} yi∈{−1,+1}, SVM的基本思想是在训练集 D D D 样本空间中找到一个划分超平面 (二维即一条分割线),将不同的样本分开,如下图
如图所示,存在多个超平面将训练样本分开,但直观从图上来看,加粗的那个超平面可能是这些超平面中最优的,因为这个超平面对于样本局部扰动的容忍性最好。
在样本空间中,划分超平面可通过如下线性方程描述
w
T
x
+
b
=
0
w^{T}x + b = 0
wTx+b=0
于是,样本空间中任意点
x
x
x到超平面的距离可以表示为
r
=
∣
w
T
+
b
∣
∣
∣
w
∣
∣
r = \frac{|w^{T} + b|}{||w||}
r=∣∣w∣∣∣wT+b∣
若超平面能将样本正确分类,对于
(
x
i
,
y
i
)
∈
D
(x_i, y_i) \in D
(xi,yi)∈D, 若
y
i
=
+
1
y_i = +1
yi=+1, 则有
w
T
x
+
b
>
0
w^{T}x + b > 0
wTx+b>0; 若
y
i
=
−
1
y_i = -1
yi=−1, 则有
w
T
x
+
b
<
0
w^{T}x + b < 0
wTx+b<0. 即
{
w
T
x
+
b
≥
+
1
,
y
i
=
+
1
w
T
x
+
b
≤
−
1
,
y
i
=
−
1
\begin{cases} w^{T}x+b \geq +1 , y_i = +1\\ w^{T}x+b \leq -1 , y_i = -1 \end{cases}
{wTx+b≥+1,yi=+1wTx+b≤−1,yi=−1
距离超平面最近的几个训练样本是得式
(
3
)
(3)
(3) 等号成立,它们被称为支持向量。于是,两个异类支持向量到超平面的距离之和为
γ
=
2
∣
∣
w
∣
∣
\gamma = \frac{2}{||w||}
γ=∣∣w∣∣2
SVM思想则是欲找到具有最大间隔的划分超平面,即
max
w
,
b
2
∣
∣
w
∣
∣
s
.
t
.
y
i
(
w
T
x
+
b
)
≥
1
,
i
=
1
,
2
,
.
.
.
,
m
\max_{w,b} \frac{2}{||w||} \\ s.t. y_i(w^{T}x + b) \geq 1, i=1,2,...,m
w,bmax∣∣w∣∣2s.t.yi(wTx+b)≥1,i=1,2,...,m
显然,为了最大化间隔,只需要最小化
∣
∣
w
∣
∣
2
||w||^2
∣∣w∣∣2, 即
min
w
,
b
1
2
∣
∣
w
∣
∣
2
s
.
t
.
y
i
(
w
T
x
+
b
)
≥
1
,
i
=
1
,
2
,
.
.
.
,
m
\min_{w,b} {\frac{1}{2} ||w||^2} \\ s.t. y_i(w^{T}x + b) \geq 1, i=1,2,...,m
w,bmin21∣∣w∣∣2s.t.yi(wTx+b)≥1,i=1,2,...,m
2.对偶问题
2.1 转换对偶问题
式 ( 6 ) (6) (6) 为原始问题,可应用拉格朗日法转换为求解对偶问题。转换为对偶问题求解的原因:
- 对偶问题更易求解,此处对偶问题只需要优化一个变量 α \alpha α且约束条件更加简单
- 能够更加自然的引入核函数,进而推广到非线性问题
首先,构造拉格朗日函数,为此需要引入拉格朗日乘子
α
i
≥
0
,
i
=
1
,
2
,
.
.
.
,
m
\alpha_i \geq 0, i = 1,2,..., m
αi≥0,i=1,2,...,m, 得拉格朗日函数:
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
m
α
i
[
y
i
(
w
T
x
+
b
)
−
1
]
L(w,b,\alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1]
L(w,b,α)=21∣∣w∣∣2−i=1∑mαi[yi(wTx+b)−1]
因此,给定一个
w
w
w 和
b
b
b, 若不满足式
(
6
)
(6)
(6) 约束,那么有
max
α
L
(
w
,
b
,
α
)
=
+
∞
\max_{\alpha} L(w, b, \alpha) = + \infty
αmaxL(w,b,α)=+∞
否则,若满足式
(
6
)
(6)
(6) 约束,有
max
α
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
\max_{\alpha} L(w, b, \alpha) = \frac{1}{2}||w||^2
αmaxL(w,b,α)=21∣∣w∣∣2
于是,优化问题
min
w
,
b
max
α
L
(
w
,
b
,
α
)
\min_{w,b}\max_{\alpha} L(w, b, \alpha)
w,bminαmaxL(w,b,α)
与式
(
6
)
(6)
(6) 所述问题是完全等价的。
根据拉格朗日对偶性,式
(
6
)
(6)
(6) 问题的对偶问题是
max
α
min
w
,
b
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
m
α
i
[
y
i
(
w
T
x
+
b
)
−
1
]
\max_{\alpha}\min_{w,b} L(w,b,\alpha) = \\ \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1]
αmaxw,bminL(w,b,α)=21∣∣w∣∣2−i=1∑mαi[yi(wTx+b)−1]
2.2 求解对偶问题
为了求得对偶问题的解,需要先求得 L ( w , b , α ) L(w,b,\alpha) L(w,b,α) 对 w w w 和 b b b 的极小在对 α \alpha α 的极大。
1) 求
min
w
,
b
L
(
w
,
b
,
α
)
\min_{w,b} L(w,b,\alpha)
minw,bL(w,b,α):对拉格朗日函数求导并令导数为0,有:
∇
w
L
(
w
,
b
,
α
)
=
w
−
∑
i
=
1
m
a
i
y
i
x
i
=
0
\nabla_{w} L(w, b, \alpha) = w - \sum_{i=1}^{m} a_i y_i x_i = 0
∇wL(w,b,α)=w−i=1∑maiyixi=0
∇ b L ( w , b , α ) = ∑ i = 1 m a i y i = 0 \nabla_{b} L(w, b, \alpha) = \sum_{i=1}^{m} a_i y_i = 0 ∇bL(w,b,α)=i=1∑maiyi=0
解得:
w
=
∑
i
=
1
m
a
i
y
i
x
i
w = \sum_{i=1}^{m} a_i y_i x_i
w=i=1∑maiyixi
∑ i = 1 m a i y i = 0 \sum_{i=1}^{m} a_i y_i = 0 i=1∑maiyi=0
将所得式
(
14
)
(14)
(14) 和 式
(
15
)
(15)
(15) 代入
L
(
w
,
b
,
α
)
L(w, b, \alpha)
L(w,b,α), 得:
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
m
α
i
[
y
i
(
w
T
x
+
b
)
−
1
]
=
1
2
∑
i
=
1
m
a
i
y
i
x
i
T
∑
i
=
j
m
a
j
y
j
x
j
−
∑
i
=
1
m
a
i
y
i
x
i
T
∑
i
=
j
m
a
j
y
j
x
j
−
b
∑
i
=
1
m
a
i
y
i
+
∑
i
=
1
m
a
i
=
∑
i
=
1
m
a
i
−
1
2
∑
i
=
1
m
a
i
y
i
x
i
T
∑
i
=
j
m
a
j
y
j
x
j
L(w, b, \alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1] \\ = \frac{1}{2}\sum_{i=1}^{m} a_iy_ix_i^T \sum_{i=j}^{m} a_jy_jx_j - \sum_{i=1}^{m}a_iy_ix_i^T\sum_{i=j}^{m}a_jy_jx_j - b\sum_{i=1}^{m}a_iy_i + \sum_{i=1}^{m}a_i \\ = \sum_{i=1}^{m}a_i - \frac{1}{2}\sum_{i=1}^{m} a_iy_ix_i^T \sum_{i=j}^{m} a_jy_jx_j
L(w,b,α)=21∣∣w∣∣2−i=1∑mαi[yi(wTx+b)−1]=21i=1∑maiyixiTi=j∑majyjxj−i=1∑maiyixiTi=j∑majyjxj−bi=1∑maiyi+i=1∑mai=i=1∑mai−21i=1∑maiyixiTi=j∑majyjxj
综上,
min
w
,
b
L
(
w
,
b
,
α
)
=
−
1
2
∑
i
=
1
m
∑
i
=
j
m
a
i
a
j
y
i
y
j
x
i
T
x
j
+
∑
i
=
1
m
a
i
\min_{w,b} L(w,b,\alpha) = - \frac{1}{2}\sum_{i=1}^{m} \sum_{i=j}^{m}a_i a_j y_i y_j x_i^T x_j + \sum_{i=1}^{m}a_i
w,bminL(w,b,α)=−21i=1∑mi=j∑maiajyiyjxiTxj+i=1∑mai
2)求
min
w
,
b
L
(
w
,
b
,
α
)
\min_{w,b} L(w,b,\alpha)
minw,bL(w,b,α) 对
α
\alpha
α 的极大:
等价于式
(
17
)
(17)
(17) 对
α
\alpha
α 求极大,等价于取负数后求极小,即
min
α
1
2
∑
i
=
1
m
∑
i
=
j
m
a
i
a
j
y
i
y
j
x
i
T
x
j
−
∑
i
=
1
m
a
i
s
.
t
.
∑
i
=
1
m
a
i
y
i
=
0
α
i
≥
0
,
i
=
1
,
2
,
.
.
.
,
n
\min_{\alpha} \frac{1}{2}\sum_{i=1}^{m} \sum_{i=j}^{m}a_i a_j y_i y_j x_i^T x_j - \sum_{i=1}^{m}a_i \\ s.t. \sum_{i=1}^{m} a_i y_i = 0 \\ \alpha_i \geq 0, i =1, 2, ..., n
αmin21i=1∑mi=j∑maiajyiyjxiTxj−i=1∑mais.t.i=1∑maiyi=0αi≥0,i=1,2,...,n
于是,得到了原始最优化问题
(
6
)
(6)
(6) 和对偶最优化问题
(
18
)
(18)
(18)
假设已经求得式
(
18
)
(18)
(18) 一个最优解
α
^
i
\hat{\alpha}_i
α^i,则根据式
(
14
)
(14)
(14) 可求得最优
w
^
\hat{w}
w^:
w
^
=
∑
i
=
1
m
a
i
^
y
i
x
i
\hat{w} = \sum_{i=1}^{m} \hat{a_i}y_ix_i
w^=i=1∑mai^yixi
因为至少存在以一个
α
^
i
>
0
\hat{\alpha}_i > 0
α^i>0 (若
α
^
i
\hat{\alpha}_i
α^i 全为0,则
w
^
=
0
\hat{w} = 0
w^=0, 即
m
a
r
g
i
n
=
2
∣
∣
w
∣
∣
=
∞
margin = \frac{2}{||w||} = \infty
margin=∣∣w∣∣2=∞, 显然不行),再根据KKT条件,即
{
乘
子
非
负
:
a
i
≥
0
约
束
条
件
:
y
i
(
w
T
x
+
b
)
−
1
≥
0
互
补
条
件
:
α
i
(
y
i
(
w
T
+
b
)
−
1
)
=
0
\begin{cases} 乘子非负:a_i \geq 0 \\ 约束条件:y_i(w^Tx + b) - 1 \geq 0 \\ 互补条件:\alpha_i (y_i (w^T + b) - 1) = 0 \end{cases}
⎩⎪⎨⎪⎧乘子非负:ai≥0约束条件:yi(wTx+b)−1≥0互补条件:αi(yi(wT+b)−1)=0
所以至少存在以一个
j
j
j, 使得
y
i
(
w
T
x
+
b
)
−
1
=
0
y_i(w^Tx + b) - 1 = 0
yi(wTx+b)−1=0, 即可求得最优
b
^
\hat{b}
b^:
b
^
=
1
y
j
−
w
^
T
x
=
y
j
−
w
^
T
x
=
y
j
−
∑
i
=
1
m
a
^
i
y
i
x
j
T
x
i
\hat{b} = \frac{1}{y_j} - \hat{w}^Tx \\ = y_j - \hat{w}^Tx \\ = y_j- \sum_{i=1}^{m} \hat{a}_iy_ix_j^Tx_i
b^=yj1−w^Tx=yj−w^Tx=yj−i=1∑ma^iyixjTxi
综上,整个线性可分SVM的解可被求得,求得的分离超平面为:
∑
i
=
1
m
α
^
i
y
i
x
T
x
i
+
b
^
=
0
\sum_{i=1}^{m} \hat{\alpha}_i y_i x^T x_i + \hat{b} = 0
i=1∑mα^iyixTxi+b^=0
其分类的决策函数为:
f
(
x
)
=
s
i
g
n
(
∑
i
=
1
m
α
^
i
y
i
x
T
x
i
+
b
^
)
f(x) = sign(\sum_{i=1}^{m} \hat{\alpha}_i y_i x^T x_i + \hat{b})
f(x)=sign(i=1∑mα^iyixTxi+b^)
3.线性SVM–软间隔
若训练数据式严格线性可分的,即存在一个超平面能完全将两类数据分开,则为硬间隔。但现实中这种情况比较少,更多的是这样的情况:
3.1 软间隔最大化
为了解决该问题,允许SVM在少量样本上出错,即将之前的硬间隔最大化条件放松一点,引入“软间隔”。
为了是不满足约束条件的样本点尽可能少,在优化目标函数中增加一个对这些项的惩罚。最常用的是
h
i
n
g
e
hinge
hinge 损失:
l
h
i
n
g
e
(
z
)
=
m
a
x
(
0
,
1
−
z
)
l_{hinge}(z) = max(0,1-z)
lhinge(z)=max(0,1−z)
即若样本满足约束条件,损失为
0
0
0,若不满足约束条件,损失则为
1
−
z
1-z
1−z, 于是目标函数变为:
min
w
,
b
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
m
a
x
(
0
,
1
−
y
i
(
w
T
x
+
b
)
)
\min_{w,b} {\frac{1}{2} ||w||^2} + C\sum_{i=1}^{m} max(0,1-y_i(w^T x + b))
w,bmin21∣∣w∣∣2+Ci=1∑mmax(0,1−yi(wTx+b))
其中
C
>
0
C>0
C>0 称为惩罚参数,
C
C
C越小时对误分类惩罚越小,越大时对误分类惩罚越大,当
C
C
C 趋向
∞
\infty
∞ 时就变成了硬间隔。实际应用时需要合理取
C
C
C,
C
C
C越小越容易欠拟合,
C
C
C越大越容易过拟合。
引入松弛变量
ξ
i
≥
0
\xi_i \geq 0
ξi≥0, 式
(
25
)
(25)
(25) 可写为:
min
w
,
b
,
ξ
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
ξ
i
s
.
t
.
y
i
(
w
T
x
+
b
)
≥
1
−
ξ
i
ξ
i
≥
0
,
i
=
1
,
2
,
.
.
.
,
m
\min_{w,b,\xi} \frac{1}{2}||w||^2 + C\sum_{i=1}^{m}{\xi_i}\\ s.t. y_i(w^Tx + b) \geq 1 - \xi_i\\ \xi_i \geq 0, i = 1, 2,..., m
w,b,ξmin21∣∣w∣∣2+Ci=1∑mξis.t.yi(wTx+b)≥1−ξiξi≥0,i=1,2,...,m
上述即为软间隔SVM
3.2对偶问题
与硬间隔SVM相似,可通过拉格朗日乘子转换为对偶问题进行求解:
L
(
w
,
b
,
α
,
β
)
=
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
ξ
i
−
∑
i
=
1
m
α
i
[
y
i
(
w
T
x
+
b
)
−
1
+
ξ
i
]
−
∑
i
=
1
m
β
i
ξ
i
L(w,b,\alpha,\beta) = \frac{1}{2}||w||^2 + C\sum_{i=1}^{m} \xi_i - \sum_{i=1}^{m}{\alpha_i[y_i(w^Tx + b) - 1 + \xi_i]} - \sum_{i=1}^{m} \beta_i \xi_i
L(w,b,α,β)=21∣∣w∣∣2+Ci=1∑mξi−i=1∑mαi[yi(wTx+b)−1+ξi]−i=1∑mβiξi
同上,为了求得对偶问题的解,需要先得
L
(
w
,
b
,
α
,
β
)
L(w,b,\alpha,\beta)
L(w,b,α,β) 对
w
w
w、
b
b
b 和
ξ
\xi
ξ 的极小再求对
α
\alpha
α 和
β
\beta
β 的极大。
1)求
min
w
,
b
,
ξ
L
(
w
,
b
,
ξ
,
α
,
β
)
\min_{w,b,\xi}L(w,b,\xi,\alpha,\beta)
minw,b,ξL(w,b,ξ,α,β): 将
L
(
w
,
b
,
ξ
,
α
,
β
)
L(w,b,\xi,\alpha,\beta)
L(w,b,ξ,α,β)分别对
w
、
b
和
ξ
w、b和\xi
w、b和ξ 求偏导并为零可得:
w
=
∑
i
=
1
m
α
i
y
i
x
i
w = \sum_{i=1}^{m}{\alpha_i y_i x_i}
w=i=1∑mαiyixi
∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}{\alpha_i y_i} = 0 i=1∑mαiyi=0
C = α i + β i C = \alpha_i + \beta_i C=αi+βi
将上面三式代入式
(
27
)
(27)
(27)得:
min
w
,
b
,
ξ
L
(
w
,
b
,
ξ
,
α
,
β
)
=
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
+
∑
i
=
1
m
α
i
\min_{w,b,\xi}L(w,b,\xi,\alpha,\beta) = -\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
w,b,ξminL(w,b,ξ,α,β)=−21i=1∑mj=1∑mαiαjyiyjxiTxj+i=1∑mαi
其中,
β
\beta
β 被消去
- 求
min
w
,
b
,
ξ
L
(
w
,
b
,
ξ
,
α
,
β
)
\min_{w,b,\xi}L(w,b,\xi,\alpha,\beta)
minw,b,ξL(w,b,ξ,α,β) 对
α
\alpha
α 极大,等价于对式
(
31
)
(31)
(31) 取负后求极小,即
min α 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j − ∑ i = 1 m α i s . t . ∑ i = 1 m α i y i = 0 0 ≤ α i ≤ C , i = 1 , 2 , . . . , m \min_{\alpha} \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 \\ s.t. \sum_{i=1}^{m} \alpha_i y_i = 0\\ 0 \leq \alpha_i \leq C, i=1,2,...,m αmin21i=1∑mj=1∑mαiαjyiyjxiTxj−i=1∑mαis.t.i=1∑mαiyi=00≤αi≤C,i=1,2,...,m
类似的,假设已经通过通用的二次规划求解方法或者SMO算法求得了式 ( 32 ) (32) (32) 的最优解 α ^ \hat{\alpha} α^, 则可根据式 ( 28 ) (28) (28) 求解最优 w ^ \hat{w} w^:
w ^ = ∑ i = 1 m α ^ y i x i \hat{w} = \sum_{i=1}^{m} \hat{\alpha} y_i x i w^=i=1∑mα^yixi
再根据KKT条件,即
{ 乘 子 非 负 : a i ≥ 0 , β i ≥ 0 约 束 条 件 : y i ( w T x + b ) − 1 ≥ ξ i 互 补 条 件 : α i ( y i ( w T + b ) − 1 + ξ i ) = 0 , β i ξ i = 0 \begin{cases} 乘子非负:a_i \geq 0, \beta_i \geq 0 \\ 约束条件:y_i(w^Tx + b) - 1 \geq \xi_i \\ 互补条件:\alpha_i (y_i (w^T + b) - 1 + \xi_i) = 0, \beta_i \xi_i = 0 \end{cases} ⎩⎪⎨⎪⎧乘子非负:ai≥0,βi≥0约束条件:yi(wTx+b)−1≥ξi互补条件:αi(yi(wT+b)−1+ξi)=0,βiξi=0
于是可求得整个软间隔SVM的解,即:
w ^ = ∑ i ∈ S V α ^ y i x i \hat{w} = \sum_{i \in SV} \hat{\alpha} y_i x_i w^=i∈SV∑α^yixi
β ^ = y j − ∑ i ∈ S V α ^ y i x i T x i \hat{\beta} = y_j - \sum_{i \in SV}\hat{\alpha} y_i x_i^T x_i β^=yj−i∈SV∑α^yixiTxi
其中, j j j 满足 0 < α ^ j < C 0 < \hat{\alpha}_j < C 0<α^j<C
对于任意样本,若 α i = 0 \alpha_i = 0 αi=0, 则此样本点不是支持向量,若 α i = 0 \alpha_i = 0 αi=0, 则此样本点是一个支持向量。
4.非线性SVM–核技巧
在遇到非线性问题时,需要采用核技巧将线性SVM推广到非线性SVM。
核技巧基本思路:
- 使用一个变换将原空间的数据映射到新空间(例如更高维),
- 在新空间中采用线性方法从训练数据中学习得到模型
4.1 核函数
核函数定义:
设 χ \chi χ 是输入空间 (欧氏空间 R n R^n Rn 的子集或离散集合),又设 H \mathcal{H} H 是特征空间(希尔伯特空间),如果存在一个 χ \chi χ 到 H \mathcal{H} H的映射 ϕ ( x ) : χ → H \phi(x): \chi \rightarrow \mathcal{H} ϕ(x):χ→H 使得对所有 x , z ∈ χ x,z \in \chi x,z∈χ,函数 K ( x , z ) \mathcal{K}(x,z) K(x,z) 满足条件 K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) \mathcal{K}(x,z) = \phi(x) \cdot \phi(z) K(x,z)=ϕ(x)⋅ϕ(z). 则称 K ( x , z ) \mathcal{K}(x,z) K(x,z) 为核函数, ϕ ( x ) \phi(x) ϕ(x) 为映射函数,式中 ϕ ( x ) ⋅ ϕ ( z ) \phi(x) \cdot \phi(z) ϕ(x)⋅ϕ(z) 为 $\phi(x) $ 和 ϕ ( z ) \phi(z) ϕ(z) 的内积。
常用核函数
4.2 非线性SVM
5.总结
SVM优点:
- 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
- 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
- 拥有高维样本空间的数据也能用SVM,这是因为数据集的复杂度只取决于支持向量而不是数据集的维度,这在某种意义上避免了“维数灾难”。
- 理论基础比较完善(例如神经网络就更像一个黑盒子)。
SVM缺点:
- 二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)
- 只适用于二分类问题。(SVM的推广SVR也适用于回归问题;可以通过多个SVM的组合来解决多分类问题)
- 对缺失数据敏感,对参数和核函数的选择敏感
5.基于sklearn的SVM
5.1 线性SVM
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
# 实例化数据集
X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
# 绘图函数
def plot_svc_decision_function(model,ax=None):
if ax is None:
ax = plt.gca()
# 获取两坐标轴的最大值和最小值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
x = np.linspace(xlim[0],xlim[1],30)
y = np.linspace(ylim[0],ylim[1],30)
Y,X = np.meshgrid(y,x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape)
ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
#线性SVM
clf = SVC(kernel = "linear").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)
clf.predict(X)
#根据决策边界,对X中的样本进⾏分类,返回的结构为n_samples
clf.score(X,y)
#返回给定测试数据和标签的平均准确度
clf.support_vectors_
#返回⽀持向量
clf.n_support_
#返回每个类中⽀持向量的个数
5.2 非线性SVM
from sklearn.datasets import make_circles
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
# 创建环形数据
X,y = make_circles(100,factor=0.1,noise=.1)
#线性SVM并不能很好处理非线性情况
clf = SVC(kernel='linear').fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_function(clf)
# 改变核函数
clf = SVC(kernel='rbf',gamma='auto').fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_function(clf)
5.3 不同核函数在不同数据集表现
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import svm
from sklearn.datasets import make_circles, make_moons,make_blobs,make_classification
# 构造数据集
n_samples = 100
datasets = [
make_moons(n_samples=n_samples, noise=0.2, random_state=0),
make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
make_blobs(n_samples=n_samples, centers=2, random_state=5),
make_classification(n_samples=n_samples,n_features =2,
n_informative=2,n_redundant=0, random_state=5)
]
Kernel = ["linear","poly","rbf","sigmoid"]
#构建⼦图
nrows=len(datasets)
ncols=len(Kernel) + 1
fig, axes = plt.subplots(nrows, ncols,figsize=(20,16))
# 开始进⾏⼦图循环
#第⼀层循环:在不同的数据集中循环
for ds_cnt, (X,Y) in enumerate(datasets):
#在图像中的第⼀列,放置原数据的分布
ax = axes[ds_cnt, 0]
if ds_cnt == 0:
ax.set_title("Input data")
ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10,
cmap=plt.cm.Paired,edgecolors='k')
ax.set_xticks(())
ax.set_yticks(())
#第⼆层循环:在不同的核函数中循环
#从图像的第⼆列开始,⼀个个填充分类结果
for est_idx, kernel in enumerate(Kernel):
#定义⼦图位置
ax = axes[ds_cnt, est_idx + 1]
#建模
clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
score = clf.score(X, Y)
#绘制图像本身分布的散点图
ax.scatter(X[:, 0], X[:, 1], c=Y
,zorder=10
,cmap=plt.cm.Paired,edgecolors='k')
#绘制⽀持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=50,
facecolors='none', zorder=10, edgecolors='k')
#绘制决策边界
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
#np.c_,类似于np.vstack的功能
Z = clf.decision_function(np.c_[XX.ravel(),
YY.ravel()]).reshape(XX.shape)
#填充等⾼线不同区域的颜⾊
ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
#绘制等⾼线
ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-','--'],
levels=[-1, 0, 1])
#设定坐标轴为不显示
ax.set_xticks(())
ax.set_yticks(())
#将标题放在第⼀⾏的顶上
if ds_cnt == 0:
ax.set_title(kernel)
#为每张图添加分类的分数
ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0')
, size=15
, bbox=dict(boxstyle='round', alpha=0.8, facecolor='white')
#为分数添加⼀个⽩⾊的格⼦作为底⾊
, transform=ax.transAxes #确定⽂字所对应的坐标轴,就是ax⼦图的坐标轴本身
, horizontalalignment='right' #位于坐标轴的什么⽅向
)
plt.tight_layout()
plt.show()
5.4 使用网格搜索法调参
from sklearn import svm
from sklearn.model_selection import GridSearchCV
from tensorflow.keras.datasets import mnist #手写数字
from sklearn.metrics import classification_report
# 导入手写数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()
#reshape 转成一维向量 28*28=784
x_train = x_train.reshape(60000,784).astype('float32')
x_test = x_test.reshape(10000,784).astype('float32')
# 归一化
x_train = x_train / 255
x_test = x_test / 255
# 设置参数
C = [0.1,0.2,0.5,0.8,1]
kernel = 'rbf'
gamma = [0.001,0.01,0.03,0.1,0.5,1]
# 构建参数字典
param_dict = {
'C':C,
'gamma':gamma
}
# 创建SVC实例
svc = svm.SVC(kernel=kernel)
# 网格搜索
gsCV = GridSearchCV(svc,
param_grid=param_dict,
n_jobs=-1,
scoring='r2',
cv=6)
gsCV.fit(x_train[:5000],y_train[:5000])
# 输出参数信息
# 最佳得分
gsCV.best_score_ # 0.9154796676634541
# 最优参数
gsCV.best_params_ # {'C': 1, 'gamma': 0.03}
# 用最佳参数实例化模型
svc = svm.SVC(C=gsCV.best_params_['C'],
kernel= kernel,
gamma= gsCV.best_params_['gamma'])
svc.fit(x_train[:1000],y_train[:1000])
svc_predict = svc.predict(x_test)
svc_metric = classification_report(y_test,svc_predict)
print(svc_metric)
# precision recall f1-score support
#
# 0 0.94 0.97 0.95 980
# 1 0.98 0.98 0.98 1135
# 2 0.86 0.93 0.89 1032
# 3 0.95 0.85 0.90 1010
# 4 0.88 0.92 0.90 982
# 5 0.84 0.92 0.88 892
# 6 0.95 0.89 0.92 958
# 7 0.93 0.91 0.92 1028
# 8 0.93 0.84 0.88 974
# 9 0.87 0.89 0.88 1009
#
# accuracy 0.91 10000
# macro avg 0.91 0.91 0.91 10000
#weighted avg 0.91 0.91 0.91 10000
6.参考
1.《机器学习》
2.https://mp.weixin.qq.com/s/dYWYdnGN9YDzzvbNyKG9pA
仅作学习笔记使用,侵删