支持向量机(SVM)
1. 什么是支持向量机?
在上图中,我们想在二维平面中通过画出一条分界线将黑点与白点分开,很明显,我们认为在上面所画的三条分界线中
H
3
H_3
H3是最好的,因为
H
1
H_1
H1压根就没有达到分开的效果,
H
2
H_2
H2最近的数据点只有很小的间隔,如果测试数据有一些噪声的话可能就会被
H
2
H_2
H2错误分类(即对噪声敏感、泛化能力弱)。
H
3
H_3
H3以较大间隔将它们分开,这样就能容忍测试数据的一些噪声而正确分类,是一个泛化能力不错的分类器。
我们假设 H 3 H_3 H3就是最好的决策边界,不难发现,它距离两个类别的最近样本最远,所以我们也可以理解为是这两个类别的最近样本支撑着 H 3 H_3 H3的位置,我们将这样的样本称之为支持向量,之所以称为向量,是因为在实际分类中,一个样本是通过一个特征向量来描述的。
简言之,SVM就是一种二类分类模型,他的基本模型是的定义在特征空间上的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。
支持向量机
-
“支持向量”:两类数据中距离我们的决策边界(面)最近的点,这些点就被称为“支持向量”。
-
“机”:是机器学习领域对一些算法的统称,常把算法看做一个机器,或者学习函数。
那么我们回过头来重新理解一下维基百科对支持向量机的定义:
支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。
2. 证明推导
在分类工作中,有两种情况,一个是线性可分,一个是非线性可分,下面我们来逐一进行讲解
2.1 线性可分
线性可分的数学定义:
对于 D 0 D_0 D0、 D 1 D_1 D1两个点集,如果存在 n n n维向量 W W W和实数 b b b,使得所有 D 0 D_0 D0中的点有 W x i + b > 0 Wx_i+b>0 Wxi+b>0, D 1 D_1 D1中的点有 W x i + b < 0 Wx_i+b<0 Wxi+b<0,则称 D 0 D_0 D0与 D 1 D_1 D1两个点线性可分,其中 W x + b = 0 Wx+b=0 Wx+b=0 即为分开 D 0 D_0 D0与 D 1 D_1 D1的超平面方程.
一个超平面由法向量 W W W和截距 b b b决定,其方程为 X T W + b = 0 X^TW+b=0 XTW+b=0, 可以规定法向量指向的一侧为正类,另一侧为负类(其样本带入超平面方程为-1)。下图画出了三个平行的超平面,法方向取左上方向。
为了找到最大间隔超平面,我们可以先选择分离两类数据的两个平行超平面,使得它们之间的距离尽可能大。在这两个超平面范围内的区域称为“间隔(margin)”,最大间隔超平面是位于它们正中间的超平面。这个过程如上图所示。
上文我们说到了正类与负类。正类的样本值带入超平面方程中满足 W T X + b ≥ 1 W^TX+b\geq1 WTX+b≥1,而负类就是 W T X + b ≤ − 1 W^TX+b\leq-1 WTX+b≤−1,因此为了统一计算,我们提出 y i ( W T X i + b ) ≥ 1 y_i(W^TX_i+b)\geq1 yi(WTXi+b)≥1,其中 y i = W T X i + b y_i=W^TX_i+b yi=WTXi+b,因此一个能够达到线性可分的超平面方程的一定满足 y i ( W T X i + b ) ≥ 1 y_i(W^TX_i+b)\geq1 yi(WTXi+b)≥1
2.1.1 点到超平面距离推导
如上图,直线方程为 W T X + b = 0 W^TX+b=0 WTX+b=0, X 1 X_1 X1 是直线外一点, X 0 X_0 X0 是直线上一点,即 W T X 0 + b = 0 W^TX_0+b=0 WTX0+b=0, d d d 是 X 1 X_1 X1 到直线的距离。
推导如下:
X
1
=
X
0
+
d
W
∥
W
∥
W
T
X
=
W
T
X
0
+
d
W
⋅
W
T
∥
W
∥
=
−
b
+
d
∥
W
∥
d
=
W
T
X
+
b
∥
W
∥
X_1=X_0+d\frac{W}{\left\|W\right\|} \\ W^TX=W^TX_0+d\frac{W \cdot W^T}{\left\|W\right\|}=-b+d\left\|W\right\| \\ d=\frac{W^TX+b}{\left\|W\right\|} \\
X1=X0+d∥W∥WWTX=WTX0+d∥W∥W⋅WT=−b+d∥W∥d=∥W∥WTX+b
如果
X
1
X_1
X1 在直线下方,则:
X
1
=
X
0
−
d
W
∥
W
∥
d
=
−
W
T
X
+
b
∥
W
∥
X_1=X_0-d\frac{W}{\left\|W\right\|} \\ d=-\frac{W^TX+b}{\left\|W\right\|}\\
X1=X0−d∥W∥Wd=−∥W∥WTX+b
综上:
d
=
−
∣
W
T
X
+
b
∣
∥
W
∥
d=-\frac{\left|W^TX+b\right |}{\left\|W\right\|}\\
d=−∥W∥∣∣WTX+b∣∣
分式上下同时乘以
α
\alpha
α,得:
d
=
α
∣
W
T
X
+
b
∣
α
(
∥
W
∥
)
=
1
∥
W
′
∥
d=\frac{\alpha \left|W^TX+b \right|}{\alpha(\left\|W\right\|)}=\frac{1}{\left\|W^{'}\right\|}
d=α(∥W∥)α∣∣WTX+b∣∣=∥W′∥1
在下面推导SVM时,我们会用到
d
=
1
∥
W
′
∥
d=\frac{1}{\left\|W^{'}\right\|}
d=∥W′∥1
2.2 线性可分的推导
间隔最大化:
margin的数学表达:(公式中的
X
0
X_0
X0是支持向量)
d
=
∣
W
T
X
0
+
b
∣
∥
W
∥
=
α
∣
W
T
X
0
+
b
∣
α
∥
W
∥
=
1
∥
W
∥
d=\frac{\left| W^TX_0+b \right|}{\left\| W \right\|}=\frac{\alpha\left| W^TX_0+b \right|}{\alpha\left\| W \right\|}=\frac{1}{\left\| W \right\|}
d=∥W∥∣∣WTX0+b∣∣=α∥W∥α∣∣WTX0+b∣∣=∥W∥1
若令超平面方程的margin趋于最大,即
∥
W
∥
\left\| W \right\|
∥W∥趋于最小,为了后续求导方便,我们在进行优化的时候会令
f
(
W
)
=
1
2
∥
W
∥
2
f(W)=\frac{1}{2}\left\| W \right\|^2
f(W)=21∥W∥2趋于最小,同时还应满足
y
i
(
W
T
X
i
+
b
)
≥
1
y_i(W^TX_i+b)\geq1
yi(WTXi+b)≥1
SVM的问题提出:
- 原函数: f ( W ) = 1 2 ∥ W ∥ 2 f(W)=\frac{1}{2}\left\| W \right\|^2 f(W)=21∥W∥2
- 限制条件: y i ( W T X i + b ) ≥ 1 y_i(W^TX_i+b)\geq1 yi(WTXi+b)≥1
将问题进行数学表达:
{
m
i
n
f
(
W
)
s
.
t
.
g
(
w
,
b
)
=
1
−
y
i
(
W
T
X
i
+
b
)
≤
0
(
α
i
≥
0
,
i
=
1
∼
n
)
\begin{cases} min\ f(W) \\ s.t.\enspace g(w,b)=1-y_i(W^TX_i+b)\leq0 \end{cases} \quad (\alpha_i\geq0,i=1\sim n)
{min f(W)s.t.g(w,b)=1−yi(WTXi+b)≤0(αi≥0,i=1∼n)
PS:
s
.
t
.
s.t.
s.t. 是subject to的缩写,表示受限于。并且只有支持向量带入
g
(
W
,
b
)
g(W,b)
g(W,b)才会等于0,其余向量带入都小于0。
引入拉格朗日乘子法解决不等式约束优化问题
到现在,我们已经初步建立了问题模型(这是一个不等式优化问题),下一步就是对其进行优化求解,在这里我们是用拉格朗日乘子法解决不等式优化问题。
原问题变为:
L
(
W
,
b
,
α
)
=
1
2
∥
W
∥
2
+
∑
i
=
1
n
α
i
[
1
−
y
i
(
W
T
X
i
+
b
)
]
(
α
i
≥
0
,
i
=
1
∼
n
)
L(W,b,\alpha)=\frac{1}{2}\left\| W \right\|^2 + \sum_{i=1}^n\alpha_i[1-y_i(W^TX_i+b)]\quad (\alpha_i\geq0,i=1\sim n)
L(W,b,α)=21∥W∥2+i=1∑nαi[1−yi(WTXi+b)](αi≥0,i=1∼n)
在拉格朗日乘子法解决不等式约束优化问题时,往往会引入KKT条件,KKT条件是拉格朗日函数达到最优解使得必要条件,下面列出的就是
L
(
w
,
b
,
α
)
L(w,b,\alpha)
L(w,b,α)的KKT条件:
{
∂
L
∂
W
=
W
−
∑
i
=
1
n
α
i
y
i
X
i
=
0
∂
L
∂
b
=
−
∑
i
=
1
n
α
i
y
i
=
0
α
i
g
i
(
W
,
b
)
=
0
α
i
≥
0
g
i
(
W
,
b
)
≤
0
\begin{cases} \frac{\partial L}{\partial W}=W-\sum_{i=1}^n\alpha_iy_iX_i=0 \\ \frac{\partial L}{\partial b}=-\sum_{i=1}^n\alpha_iy_i=0 \\ \alpha_ig_i(W,b)=0 \\ \alpha_i\geq0 \\ g_i(W,b)\leq0 \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∂W∂L=W−∑i=1nαiyiXi=0∂b∂L=−∑i=1nαiyi=0αigi(W,b)=0αi≥0gi(W,b)≤0
有了KKT条件,我们的目标变成要找到一组
W
∗
,
b
∗
,
α
∗
W^*,b^*,\alpha^*
W∗,b∗,α∗使得其满足KKT条件。但实际中,往往无法直接通过KKT条件求出最优解,于是在这里SVM的证明要再次被转换思路。
采用对偶转变求解思路:
我们重新看一下
L
(
W
,
b
,
α
)
L(W,b,\alpha)
L(W,b,α):
L
(
W
,
b
,
α
)
=
1
2
∥
W
∥
2
+
∑
i
=
1
n
α
i
[
1
−
y
i
(
W
T
X
i
+
b
)
]
⏟
1
L(W,b,\alpha)=\frac{1}{2}\left\| W \right\|^2 +\underbrace{\sum_{i=1}^n\alpha_i[1-y_i(W^TX_i+b)]}_{1}
L(W,b,α)=21∥W∥2+1
i=1∑nαi[1−yi(WTXi+b)]
在用大括号括起来的一部分中,
a
i
≥
0
,
g
i
(
W
,
b
)
≤
0
a_i\geq0,\ g_i(W,b)\leq0
ai≥0, gi(W,b)≤0也就是说
a
i
⋅
g
i
(
W
,
b
)
≤
0
a_i\cdot g_i(W,b)\leq0
ai⋅gi(W,b)≤0 。而关于其具体取值,看下图,在最优解的地方(也就是在所有满足条件的情况中使得
f
(
W
)
f(W)
f(W)最小的地方),只有当
g
i
(
W
,
b
)
=
0
g_i(W,b)=0
gi(W,b)=0时,也就是当前
X
i
X_i
Xi是支持向量,条件才会起约束作用,此时,
α
≥
0
\alpha\geq0
α≥0;而当
g
i
(
W
,
b
)
、
l
e
q
0
g_i(W,b)、leq0
gi(W,b)、leq0时,条件不起约束作用,
α
i
=
0
\alpha_i=0
αi=0,因此最优解时,各参数满足
α
i
g
i
(
W
,
b
)
=
0
\alpha_ig_i(W,b)=0
αigi(W,b)=0,也就是说最优解时,
a
i
a_i
ai与
g
i
g_i
gi的乘积的值为最大。
到这里,想必大家可以理解,即在满足
α
i
⋅
g
i
(
W
,
b
)
\alpha_i\cdot g_i(W,b)
αi⋅gi(W,b)的值最大(值为
0
0
0)的
W
,
b
W,b
W,b中,找到一组解,使得
f
(
W
)
f(W)
f(W)最小,也就是先求解条件,再在满足条件的集合中找最优解,这种求解思路与直接暴力计算KKT完全不同,将其进行数学表达:
m
i
n
W
,
b
m
i
n
α
L
(
W
,
b
)
\mathop{min}_{W,b}\mathop{min}_{\alpha}L(W,b)
minW,bminαL(W,b)
但是,对上述式子的求解,要对其求导算极值,求导的时候发现又回到了KKT条件,这又回到了上面的窘境,于是对偶被引入了,将原问题对偶处理变成新的对偶问题:
m
i
n
W
,
b
m
i
n
α
L
(
W
,
b
)
⟺
m
i
n
α
m
i
n
W
,
b
L
(
W
,
b
)
\mathop{min}\limits_{W,b}\mathop{min}\limits_{\alpha}L(W,b)\ \iff \ \mathop{min}\limits_{\alpha}\mathop{min}\limits_{W,b}L(W,b)
W,bminαminL(W,b) ⟺ αminW,bminL(W,b)
之所以可以这样转换,是因为
L
L
L函数是一个凸函数,所以满足强对偶定理。由于这里涉及凸优化理论,证明过程较为繁琐,这里就不过多赘述,感兴趣的同学可以查看凸优化理论这本书。
接下来,我们的目标变成对
m
i
n
α
m
i
n
W
,
b
L
(
W
,
b
)
\mathop{min}\limits_{\alpha}\mathop{min}\limits_{W,b}L(W,b)
αminW,bminL(W,b)的求解:
先看
m
i
n
W
,
b
L
(
W
,
b
)
\mathop{min}\limits_{W,b}L(W,b)
W,bminL(W,b):
m
i
n
W
,
b
L
(
W
,
b
)
⇒
{
∂
L
∂
W
=
W
−
∑
i
=
1
n
α
i
y
i
X
i
=
0
∂
L
∂
b
=
−
∑
i
=
1
n
α
i
y
i
=
0
⇒
{
W
=
∑
i
=
1
n
α
i
y
i
X
i
∑
i
=
1
n
α
i
y
i
=
0
\mathop{min}_{W,b}L(W,b)\ \Rightarrow\ \begin{cases} \frac{\partial L}{\partial W}=W-\sum_{i=1}^n\alpha_iy_iX_i=0 \\ \frac{\partial L}{\partial b}=-\sum_{i=1}^n\alpha_iy_i=0 \end{cases}\ \Rightarrow\ \begin{cases} W=\sum_{i=1}^n\alpha_iy_iX_i \\ \sum_{i=1}^n\alpha_iy_i=0 \end{cases}
minW,bL(W,b) ⇒ {∂W∂L=W−∑i=1nαiyiXi=0∂b∂L=−∑i=1nαiyi=0 ⇒ {W=∑i=1nαiyiXi∑i=1nαiyi=0
将这个结果带入L中可得,
L
(
W
,
b
,
α
)
=
1
2
∑
i
=
1
n
α
i
y
i
X
i
T
⋅
∑
j
n
α
j
y
j
X
j
+
∑
i
=
1
n
α
i
−
∑
i
=
1
n
α
i
y
i
X
i
T
⋅
∑
j
=
1
n
α
j
y
j
X
j
=
−
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
X
i
T
X
j
+
∑
i
=
1
n
α
i
L(W,b,\alpha)=\frac{1}{2}\sum_{i=1}^n\alpha_iy_iX_i^T\cdot\sum_{j}^n\alpha_jy_jX_j+\sum_{i=1}^n\alpha_i-\sum_{i=1}^n\alpha_iy_iX_i^T\cdot \sum_{j=1}^n\alpha_jy_jX_j=-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_jX_i^TX_j+\sum_{i=1}^n\alpha_i
L(W,b,α)=21i=1∑nαiyiXiT⋅j∑nαjyjXj+i=1∑nαi−i=1∑nαiyiXiT⋅j=1∑nαjyjXj=−21i=1∑nj=1∑nαiαjyiyjXiTXj+i=1∑nαi
于是问题变成了:
m
a
x
α
L
=
m
a
x
α
[
−
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
X
i
T
X
j
+
∑
i
=
1
n
α
i
]
(
α
i
≥
0
,
i
=
1
∼
n
)
\mathop{max}_{\alpha}L=\mathop{max}_{\alpha}[-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_jX_i^TX_j+\sum_{i=1}^n\alpha_i]\quad (\alpha_i\geq0, i=1\sim n)
maxαL=maxα[−21i=1∑nj=1∑nαiαjyiyjXiTXj+i=1∑nαi](αi≥0,i=1∼n)
到这里总结一下我们的优化进度,问题只需要对一个变量
α
\alpha
α进行求解,同时,
W
,
b
W,b
W,b均可用
α
\alpha
α来表示:
最优解情况,满足
∂
L
∂
W
=
0
\frac{\partial L}{\partial W}=0
∂W∂L=0,故
W
=
∑
i
=
1
n
α
i
y
i
X
i
W=\sum_{i=1}^n\alpha_iy_iX_i
W=i=1∑nαiyiXi
挑选一个支持向量带入
g
(
W
,
b
)
=
1
−
y
i
(
W
T
X
i
+
b
)
g(W,b)=1-y_i(W^TX_i+b)
g(W,b)=1−yi(WTXi+b)中,此时
g
(
W
,
b
)
=
0
,
b
=
1
−
y
i
W
T
X
i
y
i
g(W,b)=0, b=\frac{1-y_iW^TX_i}{y_i}
g(W,b)=0,b=yi1−yiWTXi
也可以多找几个支持向量,求其平均值,以提高模型鲁棒性。
这里有一个小问题,怎样找到最优解情况下分解超平面的支持向量呢?
上面我们讲到,一个
α
i
\alpha_i
αi 对应一个
X
i
X_i
Xi 的约束,而在SVM的约束中,只有支持向量的约束条件起作用,即
g
i
(
W
,
b
)
=
0
g_i(W,b)=0
gi(W,b)=0,并且只有此时,
α
i
≠
0
\alpha_i \neq 0
αi=0,故只需要遍历全部的
α
\alpha
α,对应不为
0
0
0的下标
i
i
i 对应的特征向量
X
i
X_i
Xi 即为支持向量。
显然,证明问题还没有结束,还要解决 m a x α L \mathop{max}\limits_{\alpha}L αmaxL,但到了这里,还要再说明一下,上述证明只是分类问题中最理想化的情况——线性可分,所以在这里再去接着求解 m a x α L \mathop{max}\limits_{\alpha}L αmaxL会使得问题得不到普适化,因此,我们先暂时将 m a x α L \mathop{max}\limits_{\alpha}L αmaxL搁置一下,看一下线性不可分时,SVM问题变成了什么新的样子。
2.2 线性不可分
线性不可分与线性可分相对,即无法在 D 0 D_0 D0和 D 1 D_1 D1点集中找到一个线性分界线,对于线性不可分我们会采取两种方式,一个是软间隔,一个是升维(将样本点从较低纬度映射到更高维度)
2.2.1 软间隔
如下图,我们允许在间隔中存在个别的几个点,以提高模型的鲁棒性,这样间隔就不硬生生的将两个区域分开,因此我们形象的称之为软间隔。那对于间隔内的点, y i ⋅ g i ( W , b ) = y i [ W T X i + b ] ≤ 1 y_i\cdot g_i(W,b)=y_i[W^TX_i+b]\leq1 yi⋅gi(W,b)=yi[WTXi+b]≤1,因此约束条件发生了变化: 1 − y i ( W T X i + b ) ≥ 0 1-y_i(W^TX_i+b)\geq0 1−yi(WTXi+b)≥0,为了让其符合最闲的约束条件,引入了一个松弛变量 ξ i \xi_i ξi,令 ξ i ≥ 0 \xi_i\geq0 ξi≥0,则 1 − y i ( W T X i + B ) − ξ i ≤ 0 1-y_i(W^TX_i+B)-\xi_i\leq0 1−yi(WTXi+B)−ξi≤0,在这里只有在间隔内的样本 ξ i \xi_i ξi 才有意义,间隔外的其他样本 ξ i = 0 \xi_i=0 ξi=0.
这里应注意, ξ i \xi_i ξi应尽可能小,如果他非常大,则模型会允许间隔内存在许多样本,造成间隔过度软的情况,如下图。
于是为了令 ξ i \xi_i ξi尽可能小,在优化过程中将其加入 m i n W 1 2 ∥ W ∥ 2 \mathop{min}\limits_{W} \frac{1}{2}\left\|W\right\|^2 Wmin21∥W∥2中,将其变成 m i n W , ξ ( 1 2 ∥ W ∥ 2 + C ∑ i = 1 m ξ i ) \mathop{min}\limits_{W,\xi}(\frac{1}{2}\left\|W\right\|^2+C\sum_{i=1}^m\xi_i) W,ξmin(21∥W∥2+C∑i=1mξi),其中 C C C是一个超参数,在训练过程中,通过改变 C C C的大小来控制 ξ i \xi_i ξi的大小,若令 C C C非常大,则模型为了最小化,会会使得 ξ i \xi_i ξi尽可能更小。
到了这里原问题变成了:
{
m
i
n
W
,
ξ
f
(
W
,
ξ
)
=
1
2
∥
W
∥
2
+
C
∑
i
=
1
m
ξ
i
s
.
t
.
g
i
(
W
,
b
)
=
1
−
y
i
(
W
T
X
i
+
B
)
−
ξ
i
≤
0
,
h
i
(
ξ
i
)
=
−
ξ
i
≤
0
(
i
=
1
∼
n
)
\begin{cases} \mathop{min}\limits_{W,\xi}f(W,\xi)=\frac{1}{2}\left\|W\right\|^2+C\sum_{i=1}^m\xi_i \\ s.t. \enspace g_i(W,b)=1-y_i(W^TX_i+B)-\xi_i\leq0,\ h_i(\xi_i)=-\xi_i\leq0 \end{cases}\quad (i=1\sim n)
⎩⎨⎧W,ξminf(W,ξ)=21∥W∥2+C∑i=1mξis.t.gi(W,b)=1−yi(WTXi+B)−ξi≤0, hi(ξi)=−ξi≤0(i=1∼n)
对于优化软间隔,在实际中会更倾向使用 Hinge Loss这一损失函数,Hinge loss在文章末会展开介绍。
2.2.2 软间隔无法解决的线性不可分
上图的左边,我们就算是使用软间隔技巧,仍然无法明确将这两个类别分开,于是,我们使用到了升维,即将样本点从较低维度映射到更高维度,所以我们应找到一个低维到高维映射的函数
ϕ
(
x
)
\phi(x)
ϕ(x)(输入为低维向量,输出为高维向量),但是找到这样一个映射函数是非常困难的,而且就算在当前数据集中找到,其他的数据集可能又不能使用,很难普适化,这又是一个很棘手的问题,但是在SVM中,我们不用明确知道
ϕ
(
x
)
\phi(x)
ϕ(x)具体表达式,因为在后面,我们会使用核函数技巧,非常巧妙地将此难题化解,所以我们先暂时使用
ϕ
(
x
)
\phi(x)
ϕ(x)。
到这,原问题变成了:
{
m
i
n
W
,
ξ
f
(
W
,
ξ
)
=
1
2
∥
W
∥
2
+
C
∑
i
=
1
m
ξ
i
s
.
t
.
g
i
(
W
,
b
)
=
1
−
y
i
(
W
T
X
i
+
B
)
−
ξ
i
≤
0
,
h
i
(
ξ
i
)
=
−
ξ
i
≤
0
(
i
=
1
∼
n
)
\begin{cases} \mathop{min}\limits_{W,\xi}f(W,\xi)=\frac{1}{2}\left\|W\right\|^2+C\sum_{i=1}^m\xi_i \\ s.t. \enspace g_i(W,b)=1-y_i(W^TX_i+B)-\xi_i\leq0,\ h_i(\xi_i)=-\xi_i\leq0 \end{cases}\quad (i=1\sim n)
⎩⎨⎧W,ξminf(W,ξ)=21∥W∥2+C∑i=1mξis.t.gi(W,b)=1−yi(WTXi+B)−ξi≤0, hi(ξi)=−ξi≤0(i=1∼n)
同样应用拉格朗日乘子法,因为存在两个不等式约束条件,所以在这里有两个拉格朗日乘子:
L
(
W
,
b
,
ξ
,
α
,
β
)
=
−
1
2
∥
W
∥
2
+
C
∑
i
=
1
m
ξ
i
+
∑
i
=
1
n
α
i
[
1
−
y
i
(
W
T
ϕ
(
X
i
)
+
b
)
−
ξ
i
]
−
∑
i
=
1
n
β
i
ξ
i
(
α
i
≥
0
,
β
i
≥
0
,
i
=
1
∼
n
)
L(W,b,\xi,\alpha,\beta)=-\frac{1}{2}\left\|W\right\|^2+C\sum_{i=1}^m\xi_i+\sum_{i=1}^n\alpha_i[1-y_i(W^T\phi(X_i)+b)-\xi_i]-\sum_{i=1}^n\beta_i\xi_i \quad(\alpha_i\geq0,\beta_i\geq0,i=1\sim n)
L(W,b,ξ,α,β)=−21∥W∥2+Ci=1∑mξi+i=1∑nαi[1−yi(WTϕ(Xi)+b)−ξi]−i=1∑nβiξi(αi≥0,βi≥0,i=1∼n)
在这里的求解步骤与上述线性可分一致:
- 同样,最优解的求解等价于 m i n W , b , ξ m a x α , β L \mathop{min}\limits_{W,b,\xi}\mathop{max}\limits_{\alpha,\beta}L W,b,ξminα,βmaxL,原理与上文一致。
- 同样,满足强对偶定理,
m
i
n
W
,
b
,
ξ
m
a
x
α
,
β
L
⟺
m
a
x
α
,
β
m
i
n
W
,
b
,
ξ
L
\mathop{min}\limits_{W,b,\xi}\mathop{max}\limits_{\alpha,\beta}L \iff \mathop{max}\limits_{\alpha,\beta}\mathop{min}\limits_{W,b,\xi}L
W,b,ξminα,βmaxL⟺α,βmaxW,b,ξminL
对 W , b , ξ W,b,\xi W,b,ξ求极值:
{ ∂ L ∂ W = W − ∑ i = 1 n α i y i ϕ i ( X i ) = 0 ∂ L ∂ b = − ∑ i = 1 n α i y i = 0 ∂ L ∂ ξ = C − α i − β i = 0 \begin{cases} \frac{\partial L}{\partial W}=W-\sum_{i=1}^n\alpha_iy_i\phi_i(X_i)=0 \\ \frac{\partial L}{\partial b}=-\sum_{i=1}^n\alpha_iy_i=0 \\ \frac{\partial L}{\partial \xi}=C-\alpha_i-\beta_i=0 \end{cases} ⎩⎪⎨⎪⎧∂W∂L=W−∑i=1nαiyiϕi(Xi)=0∂b∂L=−∑i=1nαiyi=0∂ξ∂L=C−αi−βi=0
将上述等式带入 L L L中,得:
m i n W , b , ξ L ( W , b , ξ , α , β ) = − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ϕ T ( X i ) ϕ ( X j ) + C ∑ i = 1 m ξ i − ∑ i = 1 n α i ξ i − ∑ i = 1 n β i ξ i ⏟ C − α i − β i = 0 + ∑ i = 1 n α i ( α i ≥ 0 , β i ≥ 0 , i = 1 ∼ n ) \mathop{min}\limits_{W,b,\xi}L(W,b,\xi,\alpha,\beta)=-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j\phi^T(X_i)\phi(X_j)+\underbrace{C\sum_{i=1}^m\xi_i-\sum_{i=1}^n\alpha_i\xi_i-\sum_{i=1}^n\beta_i\xi_i}_{C-\alpha_i-\beta_i=0}+\sum_{i=1}^n\alpha_i \quad (\alpha_i\geq0,\beta_i\geq0,i=1 \sim n) W,b,ξminL(W,b,ξ,α,β)=−21i=1∑nj=1∑nαiαjyiyjϕT(Xi)ϕ(Xj)+C−αi−βi=0 Ci=1∑mξi−i=1∑nαiξi−i=1∑nβiξi+i=1∑nαi(αi≥0,βi≥0,i=1∼n)
故
m i n W , b , ξ L ( W , b , ξ , α , β ) = L ( α , β ) = L ( α ) = − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ϕ T ( X i ) ϕ ( X j ) + ∑ i = 1 n α i ( α i ≥ 0 , i = 1 ∼ n ) \mathop{min}\limits_{W,b,\xi}L(W,b,\xi,\alpha,\beta)=L(\alpha,\beta)=L(\alpha)=-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j\phi^T(X_i)\phi(X_j)+\sum_{i=1}^n\alpha_i \quad (\alpha_i\geq0,i=1 \sim n) W,b,ξminL(W,b,ξ,α,β)=L(α,β)=L(α)=−21i=1∑nj=1∑nαiαjyiyjϕT(Xi)ϕ(Xj)+i=1∑nαi(αi≥0,i=1∼n)
下一步,进行 m a x L ( α ) max\ L(\alpha) max L(α),这里为了方便我们在表达 ϕ T ( X i ) ϕ ( X j ) \phi^T(X_i)\phi(X_j) ϕT(Xi)ϕ(Xj)时,采用函数 K ( X i , X j ) = ϕ T ( X i ) ϕ ( X j ) K(X_i,X_j)=\phi^T(X_i)\phi(X_j) K(Xi,Xj)=ϕT(Xi)ϕ(Xj)来表示,之这里的 K ( X i , X j ) K(X_i,X_j) K(Xi,Xj)就是上文所说的核函数,关于核函数后文会详细解释,这里先说一下其性质 K ( X i , X j ) = K ( X j , X i ) K(X_i,X_j)=K(X_j,X_i) K(Xi,Xj)=K(Xj,Xi),这个很容易就能看出来,我们就不证明了。
问题到这里就转变为:
{ m a x L ( α ) = − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ϕ T ( X i ) ϕ ( X j ) + ∑ i = 1 n α i s . t . 0 ≤ α i ≤ C , ∑ i = 1 n α i y i = 0 \begin{cases} max\ L(\alpha)=-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j\phi^T(X_i)\phi(X_j)+\sum_{i=1}^n\alpha_i \\ s.t. \enspace 0\leq\alpha_i\leq C, \ \sum_{i=1}^n\alpha_iy_i=0 \end{cases} {max L(α)=−21∑i=1n∑j=1nαiαjyiyjϕT(Xi)ϕ(Xj)+∑i=1nαis.t.0≤αi≤C, ∑i=1nαiyi=0
看到这,我们发现最终需要优化的变量只有 α \alpha α了,于是,SVM最后一个使用的优化算法smo引入了。
2.3 smo算法
smo算法与坐标上升算法类似,即每次只在一个维度上对变量进行优化。再看一遍条件中的 ∑ i = 1 n α i y i = 0 \sum_{i=1}^n\alpha_iy_i=0 ∑i=1nαiyi=0,不难发现,动了一个 a l p h a i alpha_i alphai等于零就不成立了,因此,每一次要优化 α i , α j \alpha_i,\ \alpha_j αi, αj两个变量,所以,smo的思想是每一次优化都优化一对( α i , α j \alpha_i,\ \alpha_j αi, αj),将其他变量固定(即看作常数),随后进行求偏导等于零求得极值,进而不断迭代更新 α \alpha α。
2.3.1 先计算未经修剪的 α i n e w \alpha_i^{new} αinew
根据smo的思想,原问题变为
m
a
x
α
1
,
α
2
G
(
α
1
,
α
2
)
=
α
1
+
α
2
−
1
2
α
1
2
y
1
2
K
(
X
1
,
X
1
)
−
1
2
α
2
2
y
2
2
K
(
X
1
,
X
−
2
)
−
α
1
α
2
y
1
y
2
K
(
X
1
,
X
2
)
−
α
1
y
1
∑
i
=
3
n
α
i
y
i
K
(
X
1
,
X
i
)
−
α
2
y
2
∑
i
=
3
n
α
i
y
i
K
(
X
2
,
X
i
)
−
1
2
∑
i
=
3
n
∑
j
=
3
n
α
i
α
j
y
i
y
j
K
(
X
i
,
X
j
)
+
∑
i
=
3
n
α
i
⏟
常
数
:
C
\mathop{max}\limits_{\alpha_1,\alpha_2}G(\alpha_1,\alpha_2)= \alpha_1+\alpha_2-\frac{1}{2}\alpha_1^2y_1^2K(X_1,X_1)-\frac{1}{2}\alpha_2^2y_2^2K(X_1,X-2)-\alpha_1\alpha_2y_1y_2K(X_1,X_2)- \alpha_1y_1\sum_{i=3}^n\alpha_iy_iK(X_1,X_i)- \alpha_2y_2\sum_{i=3}^n\alpha_iy_iK(X_2,X_i)- \underbrace{ \frac{1}{2}\sum_{i=3}^n\sum_{j=3}^n\alpha_i\alpha_jy_iy_jK(X_i,X_j)+ \sum_{i=3}^n\alpha_i }_{常数:C}
α1,α2maxG(α1,α2)=α1+α2−21α12y12K(X1,X1)−21α22y22K(X1,X−2)−α1α2y1y2K(X1,X2)−α1y1i=3∑nαiyiK(X1,Xi)−α2y2i=3∑nαiyiK(X2,Xi)−常数:C
21i=3∑nj=3∑nαiαjyiyjK(Xi,Xj)+i=3∑nαi
根据
∑
i
=
1
n
α
i
y
i
=
0
\sum_{i=1}^n\alpha_iy_i=0
i=1∑nαiyi=0 的条件,得出
α
1
y
1
+
α
2
y
2
=
−
∑
i
=
3
n
α
i
y
i
=
m
\alpha_1y_1+\alpha_2y_2=-\sum_{i=3}^n\alpha_iy_i=m
α1y1+α2y2=−∑i=3nαiyi=m,两边同时乘
y
1
y_1
y1,因
y
1
2
=
1
y_1^2=1
y12=1,得
α
1
=
m
y
1
−
α
2
y
1
y
2
\alpha_1=my_1-\alpha_2y_1y_2
α1=my1−α2y1y2,同时令
V
1
=
∑
i
=
3
n
α
i
y
i
K
(
X
1
,
X
i
)
,
V
2
=
∑
i
=
3
n
α
i
y
i
K
(
X
2
,
X
i
)
V_1=\sum_{i=3}^n\alpha_iy_iK(X_1,X_i),\ V_2=\sum_{i=3}^n\alpha_iy_iK(X_2,X_i)
V1=∑i=3nαiyiK(X1,Xi), V2=∑i=3nαiyiK(X2,Xi),进而简化了
W
W
W,得
G
(
α
2
)
=
m
y
1
−
α
2
y
1
y
2
+
α
2
−
1
2
(
m
−
α
2
y
2
)
2
K
(
X
1
,
X
2
)
−
1
2
α
2
2
K
(
X
2
,
X
2
)
−
(
m
−
α
2
y
2
)
α
2
y
2
K
(
X
1
,
X
2
)
−
V
1
(
m
−
α
2
y
2
)
−
V
2
α
2
y
2
−
V
2
α
2
y
2
+
C
G(\alpha_2)=my_1-\alpha_2y_1y_2+\alpha_2- \frac{1}{2}(m-\alpha_2y_2)^2K(X_1,X_2)- \frac{1}{2}\alpha_2^2K(X_2,X_2)- (m-\alpha_2y_2)\alpha_2y_2K(X_1,X_2)- V_1(m-\alpha_2y_2)- V_2\alpha_2y_2-V_2\alpha_2y_2+ C
G(α2)=my1−α2y1y2+α2−21(m−α2y2)2K(X1,X2)−21α22K(X2,X2)−(m−α2y2)α2y2K(X1,X2)−V1(m−α2y2)−V2α2y2−V2α2y2+C
到这,
W
W
W 只有一个变量
α
2
\alpha_2
α2 了,为了求
W
W
W 的最大值,我们对
α
2
\alpha_2
α2 求导,为了简化,我们用
K
i
,
j
K_{i,j}
Ki,j 代替
K
(
X
i
,
X
j
)
K(X_i,X_j)
K(Xi,Xj)
∂
G
∂
α
2
=
−
y
1
y
2
+
1
−
α
2
K
1
,
1
+
m
y
2
k
1
,
1
−
α
2
k
2
,
2
−
m
y
2
k
1
,
2
+
2
α
2
k
1
,
2
+
V
1
y
2
−
V
2
y
2
=
0
↓
(
K
1
,
1
+
K
2
,
2
−
2
k
1
,
2
)
α
2
=
y
2
(
y
2
−
y
1
+
m
K
1
,
1
−
m
K
1
,
2
+
V
1
−
V
2
)
\frac{\partial G}{\partial \alpha_2}= -y_1y_2+1-\alpha_2K_{1,1}+my_2k_{1,1}-\alpha_2k_{2,2}-my_2k_{1,2}+2\alpha_2k_{1,2}+V_1y_2-V_2y_2=0 \\ \downarrow \\ (K_{1,1}+K_{2,2}-2k_{1,2})\alpha_2= y_2(y_2-y_1+mK_{1,1}-mK_{1,2}+V_1-V_2)
∂α2∂G=−y1y2+1−α2K1,1+my2k1,1−α2k2,2−my2k1,2+2α2k1,2+V1y2−V2y2=0↓(K1,1+K2,2−2k1,2)α2=y2(y2−y1+mK1,1−mK1,2+V1−V2)
上文我们得到
W
=
∑
i
=
1
n
α
i
y
i
X
i
W=\sum_{i=1}^n\alpha_iy_iX_i
W=i=1∑nαiyiXi
故超平面分解方程为:
f
(
X
)
=
∑
i
=
1
n
α
i
y
i
K
(
X
,
X
i
)
+
b
f(X)=\sum_{i=1}^n\alpha_iy_iK(X,X_i)+b
f(X)=i=1∑nαiyiK(X,Xi)+b
将
f
(
X
)
f(X)
f(X) 带入
V
1
,
V
2
V_1,\ V_2
V1, V2 中,然后将
V
1
,
V
2
V_1,\ V_2
V1, V2 带入
∂
G
∂
α
2
\frac{\partial G}{\partial \alpha_2}
∂α2∂G所推出的等式中,可以得到:
(
K
1
,
1
+
K
2
,
2
−
2
K
1
,
2
)
α
2
=
y
2
[
f
(
X
1
)
−
y
1
⏟
E
1
−
(
f
(
X
2
)
−
y
2
)
⏟
E
2
]
+
(
K
1
,
1
+
k
2
,
2
−
2
k
1
,
2
)
α
2
(K_{1,1}+K_{2,2}-2K_{1,2})\alpha_2= y_2[ \underbrace{ f(X_1)-y_1}_{E_1}- \underbrace{ (f(X_2)-y_2)}_{E_2} ]+ (K_{1,1}+k_{2,2}-2k_{1,2})\alpha_2
(K1,1+K2,2−2K1,2)α2=y2[E1
f(X1)−y1−E2
(f(X2)−y2)]+(K1,1+k2,2−2k1,2)α2
之所以在式子中写道
f
(
X
1
)
−
y
1
f(X_1)-y_1
f(X1)−y1,是因为
f
(
X
1
)
f(X_1)
f(X1) 是模型的输出,
y
1
y_1
y1 是样本的标签,二者作差就是模型与真实值之间的误差。
令
K
1
,
1
+
K
2
,
2
−
2
K
1
,
2
=
η
K_{1,1}+K_{2,2}-2K_{1,2}=\eta
K1,1+K2,2−2K1,2=η,得:
α
2
n
e
w
=
y
2
(
E
1
−
E
2
)
η
+
α
2
o
l
d
α
1
n
e
w
=
(
m
−
α
2
n
e
w
y
2
)
y
1
\alpha_2^{new}=\frac{y_2(E_1-E_2)}{\eta}+\alpha_2^{old} \\ \alpha_1^{new}=(m-\alpha_2^{new}y_2)y_1
α2new=ηy2(E1−E2)+α2oldα1new=(m−α2newy2)y1
2.3.2 对 α 2 n e w , α 1 n e w \alpha_2^{new},\ \alpha_1^{new} α2new, α1new 值进行修剪
回顾上面对 m i n W , b , ξ m a x α , β L \mathop{min}\limits_{W,b,\xi}\mathop{max}\limits_{\alpha,\beta}L W,b,ξminα,βmaxL 进行求导时,得到 α 1 y 1 + α 2 y 2 = C \alpha_1y_1+\alpha_2y_2=C α1y1+α2y2=C,故 0 ≤ α i ≤ C 0 \leq \alpha_i \leq C 0≤αi≤C。
除此之外,还要满足 ∑ i = 1 n α i y i = 0 \sum_{i=1}^n\alpha_iy_i=0 ∑i=1nαiyi=0,得 α 1 y 1 + α 2 y 2 = m \alpha_1y_1+\alpha_2y_2=m α1y1+α2y2=m, 若 y 1 ≠ y 2 y_1 \neq y_2 y1=y2,即 y 1 ⋅ y 2 = − 1 y_1 \cdot y_2=-1 y1⋅y2=−1,则 α 1 − α 2 = m \alpha_1-\alpha_2=m α1−α2=m,若 y 1 = y 2 y_1 = y_2 y1=y2,即 y 1 ⋅ y 2 = 1 y_1 \cdot y_2=1 y1⋅y2=1,则 α 1 + α 2 = m \alpha_1+\alpha_2=m α1+α2=m。
因此在求得 α i n e w \alpha_i^{new} αinew 的值后,要根据上述条件对值的大小进行修剪。可见,这些限制均是现行的,故可用图来更清晰地观察:
当 y 1 ≠ y 2 y_1 \neq y_2 y1=y2时:
- 下界: L = m a x ( 0 , α 1 o l d − α 2 o l d ) L=max(0,\ \alpha_1^{old}-\alpha_2^{old}) L=max(0, α1old−α2old)
- 上界: H = m i n ( C , C + α 1 o l d − α 2 o l d ) H=min(C,\ C+\alpha_1^{old}-\alpha_2^{old}) H=min(C, C+α1old−α2old)
当 y 1 = y 2 y_1 = y_2 y1=y2时:
- 下界: L = m a x ( 0 , α 1 o l d + α 2 o l d − C ) L=max(0,\ \alpha_1^{old}+\alpha_2^{old}-C) L=max(0, α1old+α2old−C)
- 上界: H = m i n ( C , α 1 o l d + α 2 o l d ) H=min(C,\ \alpha_1^{old}+\alpha_2^{old}) H=min(C, α1old+α2old)
故求出的 α 1 n e w , α 2 n e w \alpha_1^{new}, \ \alpha_2^{new} α1new, α2new 的值要过一遍上下界阈值修剪:
- α i n e w < L → α i n e w = L \alpha_i^{new} < L \ \rightarrow\ \alpha_i^{new}=L αinew<L → αinew=L
- α i n e w > H → α i n e w = H \alpha_i^{new} > H \ \rightarrow\ \alpha_i^{new}=H αinew>H → αinew=H
2.3.3 对 α i \alpha_i αi 迭代
上述过程仅举例了 α 1 , α 2 \alpha_1, \ \alpha_2 α1, α2,实际要全部迭代,即将所有的 α i \alpha_i αi 取出两个进行训练。即两层for循环,外面一层选 α i \alpha_i αi,里面一层选 α j \alpha_j αj。
3. 核函数
在SVM中,我们为了将样本值从低纬度映射到高维度,提出了寻找
ϕ
(
X
)
\phi(X)
ϕ(X) 这个映射函数,然而这个映射函数很难确定,但是在后续的推导中,我们发现在使用
ϕ
(
X
)
\phi(X)
ϕ(X) 函数时,总是成对使用,即
ϕ
T
(
X
)
ϕ
(
X
)
\phi^T(X)\phi(X)
ϕT(X)ϕ(X),正因有了这个特点,我们提出了核函数技巧:
K
(
X
1
,
X
2
)
=
ϕ
T
(
X
1
)
ϕ
(
X
2
)
K(X_1,X_2)=\phi^T(X_1)\phi(X_2)
K(X1,X2)=ϕT(X1)ϕ(X2)
我们使用核函数将
X
1
,
X
2
X_1,\ X_2
X1, X2 与
ϕ
T
(
X
)
ϕ
(
X
)
\phi^T(X)\phi(X)
ϕT(X)ϕ(X) 进行映射,这样就大大减小运算量了,因为核函数的选取是非常多的,并且这样计算使得模型具有很强的普适化。
我们在实际解决问题的时候,甚至都不用关心它到底是如何映射的,只需要正确选用核函数,实现分类的目的即可。下面是一些常见的核函数,虽然大家都常见但用得最多的依旧是高斯核函数。
(1) 线性核(Linear Kernel)
k
(
x
,
z
)
=
x
T
z
+
C
k(x, z)=x^{T} z+C
k(x,z)=xTz+C
其中
C
C
C 为常数。
(2) 多项式核(Polynolial Kernel)
k
(
x
,
z
)
=
(
x
T
z
)
d
+
C
k(x, z)=\left(x^{T} z\right)^{d}+C
k(x,z)=(xTz)d+C
其中
C
C
C 为常数。
(3) 高斯核(Gaussian Kernel)
k
(
x
,
z
)
=
exp
(
−
∥
x
−
z
∥
2
2
σ
2
)
k(x, z)=\exp \left(-\frac{\|x-z\|^{2}}{2 \sigma^{2}}\right)
k(x,z)=exp(−2σ2∥x−z∥2)
其中,
σ
>
0
\sigma>0
σ>0 为高斯核的带宽 (width)。
(4) 拉普拉斯核(Laplacian Kernel)
k
(
x
i
,
x
j
)
=
exp
(
−
∥
x
i
−
x
j
∥
σ
)
,
σ
>
0
k\left(x_{i}, x_{j}\right)=\exp \left(-\frac{\left\|x_{i}-x_{j}\right\|}{\sigma}\right), \sigma>0
k(xi,xj)=exp(−σ∥xi−xj∥),σ>0
(5) Sigmoid 核
k
(
x
,
z
)
=
tanh
(
β
x
T
z
+
θ
)
k(x, z)=\tanh \left(\beta x^{T} z+\theta\right)
k(x,z)=tanh(βxTz+θ)
其中, thanh 为双曲正切函数,
β
>
0
,
θ
<
0
\beta>0, \theta<0
β>0,θ<0 。
通过前面的讨论可知,我们希望样本点在特征空间内线性可分,因此特征空间的好坏对支持向量机的性能至关重要。需要注意的是,在不知道特征映射的形式时,我们并不知道什么样的核函数的合适的,而核函数也仅是隐式地定义了这个特征空间。于是,核函数的选择称为支持向量机最大的变数。
4. 代码实例(SVM决策边界可视化)
from sklearn.svm import SVC # 导入SVM库
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_circles
#制作数据集
X,y = make_circles(100, factor=0.1, noise=.1)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
def plot_svc_decision_function(model,ax=None):
if ax is None:
ax = plt.gca() # 获取画布
xlim = ax.get_xlim() # 取 X 轴的最小值与最大值
ylim = ax.get_ylim() # 取 Y 轴的最小值与最大值
# 在最小值与最大值之间规律生成30个数
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
# 将所有的点的坐标给到决策函数,决策函数计算出的结果是点到决策平面的距离
# 分别画出到决策平面距离为-1,0,1的等高线 其中 0 等高线就是决策超平面
p_1 = model.decision_function(xy)
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)
#f训练数据
clf = SVC(kernel = "rbf").fit(X,y)
plot_svc_decision_function(clf)
print('The writer of this article is ECJTU.')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap #色彩块,好看一点
from sklearn.svm import SVC
from sklearn.datasets import make_circles,make_blobs,make_moons,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))#figsize就是行列对应的尺寸
#第一层循环:在不同的数据集中循环
for ds_cnt, (X,Y) in enumerate(datasets):
#在图像中的第一列,放置原数据的分布
ax = axes[ds_cnt, 0]
if ds_cnt == 0:
ax.set_title("Original")
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 = 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')
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
#np.mgrid,合并了之前使用的np.linspace和np.meshgrid的用法
#一次性使用最大值和最小值来生成网格
#表示为[起始值:结束值:步长]
#如果步长是复数,则其整数部分就是起始值和结束值之间创建的点的数量,并且结束值被包含在内
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = clf.decision_function(np.vstack([XX.ravel(), YY.ravel()]).T).reshape(XX.shape)
#填充等高线不同区域的颜色,距离大于零的为一类小于零的为一类填充不同颜色
ax.pcolormesh(XX, YY, Z > 0, shading='auto', 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)
, size=15
, bbox=dict(boxstyle='round', alpha=0.8, facecolor='white')
#为分数添加一个白色的格子作为底色
, transform=ax.transAxes #确定文字所对应的坐标轴,就是ax子图的坐标轴本身
, horizontalalignment='right' #位于坐标轴的什么方向
)
print('The writer of this article is ECJTU.')
plt.tight_layout()
plt.show()
最后的一些补充
还记得在软间隔的地方讲的 Hinge Loss 吗?
具体的推导可以看一篇知乎的文章,里面讲的非常详细。
Hinge Loss 代码案例
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
torch.manual_seed(2)
class classify(nn.Module):
def __init__(self,C=1):
super(classify,self).__init__()
self.w = nn.Parameter(torch.ones(2))
self.b = nn.Parameter(torch.zeros(1))
# C正相关越界点的个数 就是我们在上述推导过程中的超参数 C
self.C = C
self.relu0 = nn.ReLU()
self.relu1 = nn.ReLU()
def forward(self,x0,x1):
w2 = torch.pow(self.w,2).sum()
x0 = 1-(torch.matmul(x0,self.w) + self.b)
x1 = 1+(torch.matmul(x1,self.w) + self.b)
loss = self.relu0(x0).sum() + self.relu1(x1).sum()
return loss/ self.C + w2
model = classify(3)
opt = optim.SGD(model.parameters(),lr = 0.001)
torch.manual_seed(8)
x0 = torch.randn(10000,2) + torch.randn(10000,2) * 0.1 + torch.tensor([1,0])
x1 = torch.randn(10000,2) + torch.randn(10000,2) * 0.01 + torch.tensor([5,-7])
for i in range(200):
loss = model(x0,x1)
opt.zero_grad()
loss.backward()
if i %1000 ==0:
print(model.w)
opt.step()
plt.scatter(x0[:,0],x0[:,1],s =10)
plt.scatter(x1[:,0],x1[:,1],s =10)
x = torch.arange(-2,8,0.1)
yy = -(model.w[0] * x + model.b)/model.w[1]
yy1 = -(model.w[0] * x + model.b-1)/model.w[1]
yy2 = -(model.w[0] * x + model.b+1)/model.w[1]
print('The writer of this article is ECJTU.')
plt.plot(x,yy.data)
plt.plot(x,yy1.data)
plt.plot(x,yy2.data)
非常感谢你能够看完这篇文章,如果对你有帮助的话,点个赞再走呗🥳