【MachineLearning】之支持向量机
情景:小样本、非线性及高纬模式识别,不仅可以应用于线性分布数据,还可以用于非线性分布数据文章目录一、支持向量机(1)什么是支持向量机?(2)支持向量机分类演示二、硬间隔表示及求解三、软间隔表示及求解四、非线性分类支持向量机(1) 核技巧与核函数线性核函数多项式核函数高斯径向基核函数Sigmoid 核函数(2) 多分类支持向量机一、支持向量机(1)什么是支持向量机?支持向量机(Su...
情景:小样本、非线性及高纬模式识别,不仅可以应用于线性分布数据,还可以用于非线性分布数据
文章目录
一、支持向量机
(1)什么是支持向量机?
支持向量机(Support vector machine,SVM):一种针对线性可分数据进行分类的思路。
(PS:逻辑回归是一种简单高效的线性分类方法)
在逻辑回归中,我们通常找到一条直线对线性可分数据集进行分类,如下图
(1)
w
x
+
b
=
0
wx+b=0\tag{1}
wx+b=0(1)
可这样,问题来了,哪一条才是最优的划分方法?
在逻辑回归中,引入S 形曲线和对数损失函数进行优化求解。
支持向量机则在几何学上以更加直观的方法进行求解,如下图:
图中 w x + b = 0 wx+b=0 wx+b=0 为分割直线,我们通过这条直线将数据点分开。与此同时,分割时会在直线的两边再设立两个互相平行的虚线,这两条虚线与分割直线的距离一致。这里的距离往往也被我们称之为「间隔」,而支持向量机的分割特点在于,要使得分割直线和虚线之间的间隔最大化。同时也就是两虚线之间的间隔最大化。
目标: 找到最大的分类硬间隔所对应的分割线
(2)支持向量机分类演示
使用
scikit-learn
提供的samples_generator()
samples_generator()
可产生不同分布状态的示例数据
# 导包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 使用 samples_generator 生成分类数据
from sklearn.datasets import samples_generator
x, y = samples_generator.make_blobs(n_samples=60, centers=2, random_state=30, cluster_std=0.8) # 生成示例数据
plt.figure(figsize=(10, 8)) # 绘图
plt.scatter(x[:, 0], x[:, 1], c=y, s=40, cmap='bwr')
接下来,绘制 3 根线
plt.figure(figsize=(10, 8))
plt.scatter(x[:, 0], x[:, 1], c=y, s=40, cmap='bwr')
# 绘制 3 条不同的分割线
x_temp = np.linspace(0, 6)
for m, b in [(1, -8), (0.5, -6.5), (-0.2, -4.25)]:
y_temp = m * x_temp + b
plt.plot(x_temp, y_temp, '-k')
使用 fill_between
方法手动绘制出分类硬间隔
plt.figure(figsize=(10, 8))
plt.scatter(x[:, 0], x[:, 1], c=y, s=40, cmap='bwr')
# 绘制 3 条不同的分割线
x_temp = np.linspace(0, 6)
for m, b, d in [(1, -8, 0.2), (0.5, -6.5, 0.55), (-0.2, -4.25, 0.75)]:
y_temp = m * x_temp + b
plt.plot(x_temp, y_temp, '-k')
plt.fill_between(x_temp, y_temp - d, y_temp + d, color='#f3e17d', alpha=0.5)
二、硬间隔表示及求解
对于线性可分数据而言,几何间隔最大的分离超平面是唯一的,这里的间隔也被我们称之为「硬间隔」,而间隔最大化也就称为硬间隔最大化。
最大间隔分离超平面,我们希望最大化超平面 ( w , b ) (w,b) (w,b) 关于训练数据集的几何间隔 γ \gamma γ,满足以下约束条件:每个训练样本点到超平面 ( w , b ) (w,b) (w,b) 的几何间隔至少都是 γ \gamma γ ,因此可以转化为以下的约束最优化问题:
(2a) max w , b γ = 2 ∥ w ∥ \max\limits_{w,b}\gamma =\frac{2}{\left \|w\right \|} \tag{2a} w,bmaxγ=∥w∥2(2a)
(2b) s . t . y i ( w ∥ w ∥ x i + b ∥ w ∥ ) ≥ γ 2 \textrm s.t. y_i(\frac{w}{\left \|w\right \|}x_i+\frac{b}{\left \|w\right \|})\geq \frac{\gamma}{2} \tag{2b} s.t.yi(∥w∥wxi+∥w∥b)≥2γ(2b)
实际上, γ \gamma γ 的取值并不会影响最优化问题的解,同时,我们根据数学对偶性原则,可以得到面向硬间隔的线性可分数据的支持向量机的最优化问题:
(3a) min w , b 1 2 ∥ w ∥ 2 \min\limits_{w,b}\frac{1}{2}\left \|w\right \|^2 \tag{3a} w,bmin21∥w∥2(3a)
(3b) s . t . y i ( w x i + b ) − 1 ≥ 0 \textrm s.t. y_i(wx_i+b)-1\geq 0\tag{3b} s.t.yi(wxi+b)−1≥0(3b)
我们通常使用拉格朗日乘子法来求解最优化问题,将原始问题转化为对偶问题,通过解对偶问题得到原始问题的解。对公式(3)使用拉格朗日乘子法可得到其「对偶问题」。具体来说,对每条约束添加拉格朗日乘子 α i ≥ 0 \alpha_i \geq 0 αi≥0,则该问题的拉格朗日函数可写为:
(4) L ( w , b , α ) = 1 2 ∥ w ∥ 2 + ∑ i = 1 m α i ( 1 − y i ( w x i + b ) ) L(w,b,\alpha)=\frac{1}{2}\left \| w\right \|^2+\sum\limits_{i=1}^{m}\alpha_i(1-y_i(wx_i+b)) \tag{4} L(w,b,α)=21∥w∥2+i=1∑mαi(1−yi(wxi+b))(4)
我们通过将公式(4)分别对
w
w
w 和
b
b
b 求偏导为 0
并代入原式中,可以将
w
w
w 和
b
b
b 消去,得到公式(3)的对偶问题:
(5a) max α ∑ i = 1 N α i − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j \max\limits_{\alpha} \sum\limits_{i=1}^{N}\alpha_i-\frac{1}{2}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\alpha_i \alpha_j y_i y_j x_i x_j \tag{5a} αmaxi=1∑Nαi−21i=1∑Nj=1∑Nαiαjyiyjxixj(5a)
(5b) s . t . ∑ i = 1 N α i y i = 0 , s.t. \sum\limits_{i=1}^{N}\alpha_i y_i=0,\tag{5b} s.t.i=1∑Nαiyi=0,(5b)
(5c) α i ≥ 0 , i = 1 , 2 , ⋯   , N \alpha_i \geq 0,i=1,2,\cdots,N \tag{5c} αi≥0,i=1,2,⋯,N(5c)
解出最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*) α∗=(α1∗,α2∗,...,αN∗) 后,基于此我们可以求得最优解 w ∗ w^* w∗, b ∗ b^* b∗,由此得到分离超平面:
(6) w ∗ x + b ∗ = 0 w^*x+b^*=0 \tag{6} w∗x+b∗=0(6)
使用符号函数求得正负类之间的分类决策函数为:
(7)
f
(
x
)
=
s
i
g
n
(
w
∗
x
+
b
∗
)
f(x)=sign(w^*x+b^*) \tag{7}
f(x)=sign(w∗x+b∗)(7)
三、软间隔表示及求解
实际情况,可能会遇到 在实心点和空心点中各混入了零星的不同类别的数据点。
对于这种情况,数据集就变成了严格意义上的线性不可分。
但是,造成这种线性不可分的原因往往是因为包含「噪声」数据,它同样可以被看作是不严格条件下的线性可分。
这时候使用 「软间隔」,即可以容忍零星噪声数据被误分类
当出现上图所示的样本点不是严格线性可分的情况时,某些样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi) 就不能满足函数间隔
⩾
1
\geqslant 1
⩾1 的约束条件,即公式(3b)中的约束条件。为了解决这个问题,可以对每个样本点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi) 引入一个松弛变量
ξ
i
≥
0
\xi_i \geq 0
ξi≥0,使得函数间隔加上松弛变量
⩾
1
\geqslant 1
⩾1,即约束条件转化为:
(8)
y
i
(
w
x
i
+
b
)
≥
1
−
ξ
i
y_i(wx_i+b) \geq 1-\xi_i \tag{8}
yi(wxi+b)≥1−ξi(8)
同时,对每个松弛变量 ξ i \xi_i ξi 支付一个代价 ξ i \xi_i ξi,目标函数由原来的 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21∣∣w∣∣2 变成:
(9) 1 2 ∥ w ∥ 2 + C ∑ j = 1 N ξ i \frac{1}{2}\left \| w \right \|^2+C\sum\limits_{j=1}^{N}\xi_i \tag{9} 21∥w∥2+Cj=1∑Nξi(9)
这里, C > 0 C>0 C>0 称为惩罚参数,一般根据实际情况确定。 C C C 值越大对误分类的惩罚增大,最优化问题即为:
(10a) min w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i \min\limits_{w,b,\xi} \frac{1}{2}\left \| w \right \|^2+C\sum\limits_{i=1}^{N}\xi_i \tag{10a} w,b,ξmin21∥w∥2+Ci=1∑Nξi(10a)
(10b) s . t . y i ( w x i + b ) ≥ 1 − ξ i , i = 1 , 2 , . . . , N s.t. y_i(wx_i+b) \geq 1-\xi_i,i=1,2,...,N \tag{10b} s.t.yi(wxi+b)≥1−ξi,i=1,2,...,N(10b)
(10c) ξ i ≥ 0 , i = 1 , 2 , . . . , N \xi_i\geq 0,i=1,2,...,N \tag{10c} ξi≥0,i=1,2,...,N(10c)
这就是软间隔支持向量机的表示过程。同理,我们可以使用拉格朗日乘子法将其转换为对偶问题求解:
(11a) max α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ∗ x j ) − ∑ i = 1 N α i \max\limits_{\alpha} \frac{1}{2}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i*x_j)-\sum\limits_{i=1}^{N}\alpha_i \tag{11a} αmax21i=1∑Nj=1∑Nαiαjyiyj(xi∗xj)−i=1∑Nαi(11a)
(11b) s . t . ∑ i = 1 N α i y i = 0 s.t. \sum\limits_{i=1}^{N}\alpha_iy_i=0 \tag{11b} s.t.i=1∑Nαiyi=0(11b)
(11c) 0 ≤ α i ≤ C , i = 1 , 2 , . . . , N 0 \leq \alpha_i \leq C ,i=1,2,...,N\tag{11c} 0≤αi≤C,i=1,2,...,N(11c)
解出最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*) α∗=(α1∗,α2∗,...,αN∗) 后,基于此我们可以求得最优解 w ∗ w^* w∗, b ∗ b^* b∗,由此得到分离超平面:
(12) w ∗ x + b ∗ = 0 w^*x+b^*=0 \tag{12} w∗x+b∗=0(12)
使用符号函数求得正负类之间的分类决策函数为:
(13) f ( x ) = s i g n ( w ∗ x + b ∗ ) f(x)=sign(w^*x+b^*) \tag{13} f(x)=sign(w∗x+b∗)(13)
四、非线性分类支持向量机
上面方式应用场景是在 线性可分 或 不严格线性可分 情况下。
然而,线性可分的样本往往只是理想情况下,现实中的原始样本大多数情况下是线性不可分。
这时候,支持向量机还能进行分类吗?
步骤:
- 将线性不可分数据转换为线性可分数据
- 再对线性可分数据进行划分
我们把这种数据转换的技巧称作「核技巧」,实现数据转换的函数称之为「核函数」。
(1) 核技巧与核函数
核技巧的关键在于空间映射,即将低维数据映射到高维空间中,使得数据集在高维空间能被线性可分。
如下图所示:
在二维空间,明显无法使用一条直线把两类数据分开。
此时,使用 核技巧
将其映射到三维空间,就变成了可以被平面线性可分的状态。
「映射」的过程也就是通过核函数转换的过程
以下为常见的核函数:
线性核函数
(1) k ( x i , x j ) = x i ∗ x j k\left ( x_i, x_j \right )=x_i*x_j \tag{1} k(xi,xj)=xi∗xj(1)
多项式核函数
(2) k ( x i , x j ) = ( x i ∗ x j ) d , d ≥ 1 k\left ( x_i, x_j \right )=\left ( x_i*x_j \right )^d, d \geq 1 \tag{2} k(xi,xj)=(xi∗xj)d,d≥1(2)
高斯径向基核函数
(16) k ( x i , x j ) = exp ( − ∥ x i − x j ∥ 2 2 2 σ 2 ) = e x p ( − γ ∗ ∥ x i − x j ∥ 2 2 ) , γ > 0 k\left ( x_i, x_j \right ) = \exp \left(-{\frac {\left \|{\mathbf {x_i}}-{\mathbf {x_j}}\right \|_{2}^{2}}{2\sigma ^{2}}}\right)=exp\left ( -\gamma * \left \| x_i-x_j \right \|_{2} ^2 \right ), \gamma>0 \tag{16} k(xi,xj)=exp(−2σ2∥xi−xj∥22)=exp(−γ∗∥xi−xj∥22),γ>0(16)
Sigmoid 核函数
(17) k ( x i , x j ) = t a n h ( β ∗ x i x j + θ ) , β > 0 , θ < 0 k\left ( x_i, x_j \right )=tanh\left ( \beta * x_ix_j+\theta \right ), \beta > 0 , \theta < 0 \tag{17} k(xi,xj)=tanh(β∗xixj+θ),β>0,θ<0(17)
(2) 多分类支持向量机
支持向量机最初是为二分类问题设计
-
一对多法:即训练时依次把某个类别的样本归为一类,剩余的样本归为另一类,这样 k k k 个类别的样本就构造出了 k k k 个支持向量机。
-
一对一法:即在任意两类样本之间构造一个支持向量机,因此 k k k 个类别的样本就需要设计 k ( k − 1 ) ÷ 2 k(k-1) \div 2 k(k−1)÷2 个支持向量机。
而在 scikit-learn,实现多分类支持向量机通过设定参数 decision_function_shape
来确定,其中:
decision_function_shape='ovo'
:代表一对一法。decision_function_shape='ovr'
:代表一对多法。
更多推荐
所有评论(0)