文章目录
前言
支持向量机(Support vector machines,SVM)是一种二分类模型(可以拓展至多分类)。它的基本模型是定义在特征空间上的间隔最大化的线性分类器。它跟感知机的联系是,感知机是满足分类条件的其中一个超平面,而SVM是最鲁棒的那个。
一、算法推导
1.模型
SVM是在所有满足分类要求的超平面中
1
^{1}
1,选择最鲁棒的那个超平面
2
^2
2。
所以我们的模型是一个超平面
f
(
x
)
=
S
i
g
n
(
w
T
x
+
b
)
f(x) = Sign(w^{T} x+b)
f(x)=Sign(wTx+b)在超平面的左侧样本的
w
T
x
+
b
>
0
w^Tx+b>0
wTx+b>0,此时
f
(
x
)
f(x)
f(x)输+1,在超平面右侧样本的
w
T
x
+
b
<
0
w^Tx+b<0
wTx+b<0,此时
f
(
x
)
f(x)
f(x)输出-1。
2.策略
上面提到SVM求出来的超平面需要满足两个条件:
(1)所有节点正确分类
(2)鲁棒性最强
我们分别将这两个条件进行量化。
首先是所有节点正确分类。即对于任一节点
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi),若
y
i
=
+
1
y_i=+1
yi=+1,则应该有
w
T
x
+
b
>
0
w^Tx+b>0
wTx+b>0;若
y
i
=
−
1
y_i=-1
yi=−1,则应该有
w
T
x
+
b
<
0
w^Tx+b<0
wTx+b<0,令
{
w
0
T
x
i
+
b
0
>
0
,
y
i
=
+
1
w
0
T
x
i
+
b
0
<
0
,
y
i
=
−
1
\left\{\begin{array}{ll} \boldsymbol{w_0}^{\mathrm{T}} \boldsymbol{x}_{i}+b_0 >0, & y_{i}=+1 \\ \boldsymbol{w_0}^{\mathrm{T}} \boldsymbol{x}_{i}+b_0<0, & y_{i}=-1 \end{array}\right.
{w0Txi+b0>0,w0Txi+b0<0,yi=+1yi=−1
那么肯定存在一个
δ
=
m
i
n
(
w
T
x
i
+
b
)
\delta=min(w^Tx_i+b)
δ=min(wTxi+b)使得
{
w
0
T
x
i
+
b
0
⩾
δ
,
y
i
=
+
1
w
0
T
x
i
+
b
0
⩽
δ
,
y
i
=
−
1
\left\{\begin{array}{ll} \boldsymbol{w_0}^{\mathrm{T}} \boldsymbol{x}_{i}+b_0 \geqslant\delta, & y_{i}=+1 \\ \boldsymbol{w_0}^{\mathrm{T}} \boldsymbol{x}_{i}+b_0 \leqslant\delta, & y_{i}=-1 \end{array}\right.
{w0Txi+b0⩾δ,w0Txi+b0⩽δ,yi=+1yi=−1两边同时除以
δ
\delta
δ相当于对平面进行一个缩放,不影响最终的结果。所以可以写成
{
w
T
x
i
+
b
⩾
+
1
,
y
i
=
+
1
w
T
x
i
+
b
⩽
−
1
,
y
i
=
−
1
\left\{\begin{array}{ll} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \geqslant+1, & y_{i}=+1 \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b \leqslant-1, & y_{i}=-1 \end{array}\right.
{wTxi+b⩾+1,wTxi+b⩽−1,yi=+1yi=−1合并成一条公式就是
y
i
(
w
T
x
i
+
b
)
⩾
1
y_i(w^Tx_i+b) \geqslant1
yi(wTxi+b)⩾1
即最终的超平面如下图所示。
其次是鲁棒性最强。我们知道满足分类条件的超平面很多,但是哪一个是最稳定(鲁棒)的呢,这个可以根据超平面与节点之间的距离来衡量。超平面离节点越远,那么这些节点在分类过程中就越不容易被误判,所以这个模型会越稳定。任意点
x
x
x到超平面的
w
T
x
+
b
w^Tx+b
wTx+b的距离可以表示为
d
=
∣
w
T
x
+
b
∣
∥
w
∥
d=\frac{\left|\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b\right|}{\|\boldsymbol{w}\|}
d=∥w∥∣∣wTx+b∣∣
我们回到第一个条件:可以发现,只要最靠近超平面的那几个点满足
y
i
(
w
T
x
i
+
b
)
⩾
1
y_i(w^Tx_i+b) \geqslant1
yi(wTxi+b)⩾1,那么其他节点也一定满足,所以我们只需要讨论这些节点到超平面的距离即可,而这些节点我们称之为支持向量,这也是支持向量机这个名字的由来。
观察这些节点,我们可以发现它们满足
X
i
T
w
+
b
=
1
X_{i}^Tw+b=1
XiTw+b=1所以距离可以写成
d
=
2
∥
w
∥
d=\frac{2}{\|\boldsymbol{w}\|}
d=∥w∥2我们要做的是将距离d最大化。
最后把这两个条件结合起来就可以得到
min
W
,
b
J
(
W
)
=
min
W
,
b
1
2
∥
w
∥
2
s.t.
y
i
(
X
i
T
W
+
b
)
≥
1
,
i
=
1
,
2
,
…
n
(
1
)
\begin{array}{l} \min _{W, b} J(W)=\min _{W, b} \frac{1}{2}\|w\|^{2} \\ \text { s.t. } \quad y_{i}\left(X_{i}^{T} W+b\right) \geq 1, i=1,2, \ldots n \end{array} (1)
minW,bJ(W)=minW,b21∥w∥2 s.t. yi(XiTW+b)≥1,i=1,2,…n(1)
这个就是SVM的优化方程,构造拉格朗日函数就可以得到它的损失函数
J
(
w
)
=
L
(
W
,
b
,
α
)
=
1
2
∥
w
∥
2
−
∑
i
=
1
n
α
i
[
y
i
(
X
i
T
w
+
b
)
−
1
]
(
2
)
J(w) = L(W, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y_{i}\left(X_{i}^{T} w+b\right)-1\right] (2)
J(w)=L(W,b,α)=21∥w∥2−i=1∑nαi[yi(XiTw+b)−1](2)
3.算法
如何求解?
min
w
,
b
J
(
w
)
=
min
w
,
b
1
2
∥
w
∥
2
s.t.
y
i
(
X
i
T
w
+
b
)
≥
1
,
i
=
1
,
2
,
…
n
(
1
)
\begin{array}{l} \min _{w, b} J(w)=\min _{w, b} \frac{1}{2}\|w\|^{2} \\ \text { s.t. } \quad y_{i}\left(X_{i}^{T} w+b\right) \geq 1, i=1,2, \ldots n \end{array}(1)
minw,bJ(w)=minw,b21∥w∥2 s.t. yi(XiTw+b)≥1,i=1,2,…n(1) 可以应用拉格朗日乘子法构造拉格朗日函数,再通过求解其对偶问题得到原始问题的最优解。
为什么要转为对偶问题?
(1)对偶问题更容易求解,因为其对偶问题只需优化一个变量
α
\alpha
α且约束条件更简单。
(2)能更加自然地引入核函数,进而推广到非线性问题。
(3)无论原始问题是否是凸的,对偶问题都是凸优化问题
(4)对偶问题可以给出原问题的一个下界(当满足KKT条件时,对偶问题和原问题的解相同)
首先构造拉格朗日函数:
L
(
W
,
b
,
α
)
=
1
2
∥
W
∥
2
−
∑
i
=
1
n
α
i
[
y
i
(
X
i
T
W
+
b
)
−
1
]
(
2
)
L(W, b, \alpha)=\frac{1}{2}\|W\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y_{i}\left(X_{i}^{T} W+b\right)-1\right] (2)
L(W,b,α)=21∥W∥2−i=1∑nαi[yi(XiTW+b)−1](2)
给定一个W和b,若不满足式(1)的约束条件,那么有
max
α
L
(
W
,
b
,
α
)
=
+
∞
(
3
)
\max _{\alpha} L(W, b, \alpha)=+\infty(3)
αmaxL(W,b,α)=+∞(3)(这是因为不满足约束条件时,后半部分大于0,因为只要W足够大,那么
L
(
W
,
b
,
a
)
L(W,b,a)
L(W,b,a)就会趋于无穷大)
否则,若满足约束条件
max
α
L
(
W
,
b
,
α
)
=
J
(
W
)
=
1
2
∣
∣
W
∣
∣
2
(
4
)
\max _{\alpha} L(W, b, \alpha)= J(W)=\frac{1}{2} ||W||^2 (4)
αmaxL(W,b,α)=J(W)=21∣∣W∣∣2(4)结合(3、4)知,优化问题
min
W
,
b
max
α
,
L
(
W
,
b
,
α
)
(
5
)
\min _{W,b} \max _{\alpha}, L(W, b, \alpha) (5)
W,bminαmax,L(W,b,α)(5) 与(1)等价
根据拉格朗日对偶性,式(5)所述问题的对偶问题是:
max
α
min
W
,
b
,
L
(
W
,
b
,
α
)
(
6
)
\max _{\alpha} \min _{W,b}, L(W, b, \alpha) (6)
αmaxW,bmin,L(W,b,α)(6)
首先求求
min
W
,
b
,
L
(
W
,
b
,
α
)
\min _{W,b}, L(W, b, \alpha)
W,bmin,L(W,b,α)
L
(
W
,
b
,
α
)
L(W,b,\alpha)
L(W,b,α)对
W
,
b
W,b
W,b求导,并令其等于0,得到:
∇
W
L
(
W
,
b
,
α
)
=
W
−
∑
i
=
1
n
α
i
y
i
X
i
=
0
⟹
W
=
∑
i
=
1
n
α
i
y
i
X
i
∇
b
L
(
W
,
b
,
α
)
=
−
∑
i
=
1
n
α
i
y
i
=
0
⟹
∑
i
=
1
n
α
i
y
i
=
0
\begin{aligned} \nabla_{W} L(W, b, \alpha)=W &-\sum_{i=1}^{n} \alpha_{i} y_{i} X_{i}=0 \Longrightarrow W=\sum_{i=1}^{n} \alpha_{i} y_{i} X_{i} \\ \nabla_{b} L(W, b, \alpha) &=-\sum_{i=1}^{n} \alpha_{i} y_{i}=0 \Longrightarrow \sum_{i=1}^{n} \alpha_{i} y_{i}=0 \end{aligned}
∇WL(W,b,α)=W∇bL(W,b,α)−i=1∑nαiyiXi=0⟹W=i=1∑nαiyiXi=−i=1∑nαiyi=0⟹i=1∑nαiyi=0
将上两式代入
L
(
W
,
b
,
a
)
L(W,b,a)
L(W,b,a):
min
W
,
b
L
(
W
,
b
,
α
)
=
−
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
X
i
T
X
j
+
∑
i
=
1
n
α
i
(
7
)
\min _{W, b} L(W, b, \alpha)=-\frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j} X_{i}^{T} X_{j}+\sum_{i=1}^{n} \alpha_{i}(7)
W,bminL(W,b,α)=−21i=1∑nj=1∑nαiαjyiyjXiTXj+i=1∑nαi(7)
min
W
,
b
,
L
(
W
,
b
,
α
)
\min _{W,b}, L(W, b, \alpha)
minW,b,L(W,b,α)对
α
\alpha
α求极大,等价于(7)对
α
\alpha
α求极大,也等价于(7)取负数后对
α
\alpha
α求极小:
min
α
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
X
i
T
X
j
−
∑
i
=
1
n
α
i
(
8
)
\min _{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j} X_{i}^{T} X_{j}-\sum_{i=1}^{n} \alpha_{i} (8)
αmin21i=1∑nj=1∑nαiαjyiyjXiTXj−i=1∑nαi(8)同时满足约束条件:
∑
i
=
1
n
α
i
y
i
=
0
α
i
≥
0
,
i
=
1
,
2
,
…
,
n
(
9
)
\begin{aligned} &\sum_{i=1}^{n} \alpha_{i} y_{i}=0\\ &\alpha_{i} \geq 0, i=1,2, \ldots, n \end{aligned} (9)
i=1∑nαiyi=0αi≥0,i=1,2,…,n(9)
上述问题即为
min
W
,
b
J
(
W
)
=
min
W
,
b
1
2
∥
W
∥
2
s.t.
y
i
(
X
i
T
W
+
b
)
≥
1
,
i
=
1
,
2
,
…
n
(
1
)
\begin{array}{l} \min _{W, b} J(W)=\min _{W, b} \frac{1}{2}\|W\|^{2} \\ \text { s.t. } \quad y_{i}\left(X_{i}^{T} W+b\right) \geq 1, i=1,2, \ldots n \end{array}(1)
minW,bJ(W)=minW,b21∥W∥2 s.t. yi(XiTW+b)≥1,i=1,2,…n(1) 的对偶问题
怎么求解(8-9)这个对偶问题?
我们可以看出来这是一个二次规划问题,问题规模正比于训练样本数,我们常用 SMO(Sequential Minimal Optimization) 算法求解。
SMO(序列最小优化算法)的想法是:每次只优化一个参数,其他参数先固定,仅求当前这个优化参数的极值。
SMO 算法每次只优化一个参数,但我们的优化目标有约束条件:
∑
i
=
1
n
α
i
y
i
=
0
α
i
≥
0
,
i
=
1
,
2
,
…
,
n
(
9
)
\begin{aligned} &\sum_{i=1}^{n} \alpha_{i} y_{i}=0\\ &\alpha_{i} \geq 0, i=1,2, \ldots, n \end{aligned} (9)
i=1∑nαiyi=0αi≥0,i=1,2,…,n(9)
没有办法一次只变动一个参数,所以我们选择一次更新两个参数,具体步骤为:
(1)选择两个需要更新的参数
α
i
,
α
j
\alpha_{i}, \alpha_{j}
αi,αj,固定其他参数。于是约束就变成了:
α
i
y
i
+
α
j
y
j
=
c
,
α
i
>
=
0
,
α
j
>
=
0
\alpha_{i}y_{i} + \alpha_{j}y_{j}=c, \alpha_{i}>=0, \alpha_{j}>=0
αiyi+αjyj=c,αi>=0,αj>=0其中
c
=
−
∑
k
≠
i
,
j
α
k
y
k
c=-\sum_{k \neq i, j} \alpha_{k} y_{k}
c=−∑k=i,jαkyk,由此得到
α
j
=
c
−
α
i
y
i
y
j
\alpha_{j}=\frac{c-\alpha_{i} y_{i}}{y_{j}}
αj=yjc−αiyi,也就是说,我们可以用
α
i
\alpha_{i}
αi的表达式替代
α
j
\alpha_{j}
αj,这样就相当于把目标问题转化成了仅有一个约束条件的最优化问题,仅有的约束是
α
i
>
=
0
\alpha_{i}>=0
αi>=0
(2)对于仅有一个约束条件的最优化问题,我们可以对
α
i
\alpha_{i}
αi进行求导,令其导数等于0, 得到
α
i
∗
\alpha_{i}^*
αi∗, 再根据
α
i
∗
\alpha_{i}^*
αi∗求出
α
j
∗
\alpha_{j}^*
αj∗
(3)重复(1-2)直至算法收敛,得到最优的参数
α
\alpha
α
求出
α
\alpha
α后,再根据
W
=
∑
i
=
1
n
α
i
y
i
X
i
W=\sum_{i=1}^{n} \alpha_{i} y_{i} X_{i}
W=∑i=1nαiyiXi求出W*
又根据KKT条件(强对偶和满足KKT条件是充分必要条件),即
{
α
i
⩾
0
y
i
f
(
x
i
)
−
1
⩾
0
α
i
(
y
i
f
(
x
i
)
−
1
)
=
0
\left\{\begin{array}{l} \alpha_{i} \geqslant 0 \\ y_{i} f\left(\boldsymbol{x}_{i}\right)-1 \geqslant 0 \\ \alpha_{i}\left(y_{i} f\left(\boldsymbol{x}_{i}\right)-1\right)=0 \end{array}\right.
⎩⎨⎧αi⩾0yif(xi)−1⩾0αi(yif(xi)−1)=0总有
a
i
=
0
a_{i}=0
ai=0或
y
i
f
(
x
i
)
=
1
y_{i}f(x_{i})=1
yif(xi)=1. 若
a
i
=
0
a_{i}=0
ai=0,则该样本不会在式(9)中出现,也不会对
f
(
x
)
f(x)
f(x)有任何影响;若
α
i
>
0
\alpha_{i}>0
αi>0,则必有
y
i
f
(
x
i
)
=
1
y_{i}f(x_{i})=1
yif(xi)=1,所对应的样本点位于最大间隔边界上,式一个支持向量,即最终模型仅与支持向量有关。
f
(
x
)
=
w
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
x
i
T
x
+
b
(
10
)
\begin{aligned}f(\boldsymbol{x}) &=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b \\&=\sum_{i=1}^{m} \alpha_{i} y_{i}\boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}+b\end{aligned}(10)
f(x)=wTx+b=i=1∑mαiyixiTx+b(10)
对于任意一个支持向量
(
x
s
,
y
s
)
(x_{s}, y_{s})
(xs,ys), 都有
y
s
f
(
x
s
)
=
1
y_{s}f(x_{s})=1
ysf(xs)=1,即
y
s
(
∑
i
∈
S
α
i
y
i
x
i
T
x
s
+
b
)
=
1
y_{s}\left(\sum_{i \in S} \alpha_{i} y_{i} \boldsymbol{x}_{i}^{\mathrm{T}} \boldsymbol{x}_{s}+b\right)=1
ys(i∈S∑αiyixiTxs+b)=1
通过上式求得
b
∗
b^*
b∗, (左右两边乘以
y
s
y_{s}
ys,然后使用所有的支持向量求解的平均值)。
4.SVM的拓展
4.1 软间隔
在前面的讨论中,我们一直假定训练数据是严格线性可分的,即存在一个超平面能完全将两类数据分开。但是现实任务这个假设往往不成立,例如下图所示的数据。
解决该问题的一个办法是允许SVM在少量样本上出错,即将之前的硬间隔最大化条件放宽一点,为此引入“软间隔”的概念,即允许少量样本不满足约束
y
i
(
X
i
T
W
+
b
)
≥
1
y_{i}\left(X_{i}^{T} W+b\right) \geq 1
yi(XiTW+b)≥1
为了使不满足上述条件的样本尽可能少,我们在目标函数中加入一个惩罚项。即:
min
W
,
b
,
ξ
1
2
∥
W
∥
2
+
C
∑
i
=
1
n
ξ
i
s.t.
y
i
(
X
i
T
W
+
b
)
≥
1
−
ξ
i
ξ
i
≥
0
,
i
=
1
,
2
,
…
n
\begin{aligned} &\min _{W, b, \xi} \frac{1}{2}\|W\|^{2}+C \sum_{i=1}^{n} \xi_{i}\\ &\text {s.t. } y_{i}\left(X_{i}^{T} W+b\right) \geq 1-\xi_{i}\\ &\xi_{i} \geq 0, i=1,2, \ldots n \end{aligned}
W,b,ξmin21∥W∥2+Ci=1∑nξis.t. yi(XiTW+b)≥1−ξiξi≥0,i=1,2,…n上式所述问题即软间隔支持向量机。求解方法与硬间隔类似
4.2 核技巧
(1)非线性带来高维转换
(2)对偶表示带来内积
核技巧的基本思路分为两步:
(1)使用一个变换将原空间的数据映射到新空间:
x
−
>
ϕ
(
x
)
x->\phi(x)
x−>ϕ(x)例如更高维甚至无穷维的空间);
(2)然后在新空间里用线性方法从训练数据中学习得到模型。
但是升维后,计算
ϕ
(
x
)
ϕ
(
z
)
\phi(x)\phi(z)
ϕ(x)ϕ(z)比较复杂,因此引入核函数,使得
K
(
x
,
z
)
=
ϕ
(
x
)
ϕ
(
z
)
K(x,z) = \phi(x)\phi(z)
K(x,z)=ϕ(x)ϕ(z),而
K
(
x
,
z
)
K(x,z)
K(x,z)的计算相对容易。
核函数怎么选?
(1)如果特征维数很高,往往线性可分(SVM解决非线性分类问题的思路就是将样本映射到更高维的特征空间中),可以采用LR或者线性核的SVM;
(2)如果样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核明显计算量会大于线性核,所以手动添加一些特征,使得线性可分,然后可以用LR或者线性核的SVM;
(3)如果不满足上述两点,即特征维数少,样本数量正常,可以使用高斯核的SVM。
二、应用场景
SVM主要用于分类,并且是小样本的分类
三、代码实现
这里主要使用sklearn这个库来实现机器学习算法。
1.导入相关库
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
2.读取样例数据
data = load_breast_cancer() # 获取样例数据,这里的数据乳腺癌检测,y=0代表没有乳腺癌,y=1代表有
X = pd.DataFrame(data.data,columns=data.feature_names)
y = data.target
3.划分训练集和测试集
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.3,random_state=0)
4.建立模型
model = SVC().fit(X_train,y_train)
y_pred = model.predict(X_test)
5.评估模型
由于是分类问题,所以我们可以直接使用准确率来评估模型
print('ACC:%.3f'%(accuracy_score(y_test,y_pred)))
ACC:0.924
其实上面用的方法是留出法,我们也可以使用交叉验证法来计算模型误差。这样就把划分训练集和测试集、建立模型以及评估模型这几步合并在一起。
acc = np.mean(cross_val_score(LogisticRegression(),X,y,cv=10,scoring='accuracy'))
print('ACC:%.3f'%(acc))
ACC:0.947
可以看到两者比较接近。
四、优缺点
1.优点
(1)由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优
(2)不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
(3)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:①增、删非支持向量样本对模型没有影响;②支持向量样本集具有一定的鲁棒性;
2.缺点
(1)二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)
(2)对参数和核函数的选择比较敏感;原始的SVM只比较擅长处理二分类问题。