支持向量机(SVM)
再讲之前先看一个机器学习算法热度榜:
从图片中可以看出支持向量机(SVM)在机器学习中多么重要!!!
在讲SVM之前,再看两幅图:
![]() | ![]() |
---|---|
从左图中可以看出红绿数据点基本可以通过一条直线进行区分,我们称这种情况为线性可分。而右图中的两种数据点有的交织在一起,不可能通过一条直线进行区分,这种情况称之为非线性可分。
将数据集分割开来的直线我们称为分隔超平面(separating hyperplane)。上面左图数据点都在二维平面上,所以此时的分割超平面就是一条直线。数据点都在三维空间中,此时的分割超平面就是一个平面。如果数据集是
N
N
N维的,那么就需要一个
N
−
1
N-1
N−1维的什么东东进行分割,这个东东可以称之为超平面(hyperplane),也是分类的决策边界。
处于决策边界两边的数据分属于不同的类别,数据点离决策边界越远,最后的预测结果越可靠。
SVM相关概念
如下图,三条直线都可以将数据集进行分割,但是哪种分割方式最好呢?
是否最小化数据点到分隔超平面之间的平均距离?这样是不是类似于最佳拟合直线?在本节这并不是最佳方案。我们希望找到离分割超平面最近的点,并确保它们离分隔超平面尽可能的远,这里点到分割面的距离被称为间隔(margin)。这些离分割超平面的最近的点我们称之为支持向量(support vector)。
上图中的分隔超平面可以写成
w
T
x
+
b
w^Tx+b
wTx+b的形式。计算A点(支持向量)到分割超平面的距离,就必须找到点到分割面的法线或垂线的长度
∣
w
A
x
+
b
∣
∣
∣
w
∣
∣
\frac{|w^Ax+b|}{||w||}
∣∣w∣∣∣wAx+b∣。
优化问题
SVM使用的类别标签是-1和1,目的是方便数学上处理。如果数据点处于正方向(即+1类)并且离分割超平面很远的位置时,
w
T
x
+
b
w^Tx+b
wTx+b会是一个很大的整数,同时
l
a
b
e
l
∗
w
T
x
+
b
label*w^Tx+b
label∗wTx+b(点到分割超平面的间隔)也是一个很大的正数。如果数据点处于负方向(即-1类)并且离分割超平面很远的位置时,此时
l
a
b
e
l
label
label为
−
1
-1
−1,
l
a
b
e
l
∗
w
T
x
+
b
label*w^Tx+b
label∗wTx+b也是一个很大的正数。
分类器的目的就是找出合适的
w
w
w和
b
b
b。在找到支持向量之后,就需要对间隔进行最大化,可以形式化为:
a
r
g
m
a
x
w
,
b
{
m
i
n
n
(
l
a
b
e
l
∗
(
w
T
+
b
)
)
∗
1
∣
∣
w
∣
∣
}
arg max_{w,b}\{min_n(label*(w^T+b))*\frac{1}{||w||}\}
argmaxw,b{minn(label∗(wT+b))∗∣∣w∣∣1}
直接求解上述问题非常困难,所以需要转换一下上述形式。首先看一下大括号里的内容,对乘积优化是一件令人头疼的事情,因此需要固定其中一个引子而最大化其他因子。如果另所有支持向量的
l
a
b
e
l
∗
w
T
x
+
b
label*w^Tx+b
label∗wTx+b都等于1,那就可以直接通过求解
∣
∣
w
∣
∣
−
1
||w||^{-1}
∣∣w∣∣−1的最大值来得到最终解。但是,并非所有数据点的
l
a
b
e
l
∗
w
T
x
+
b
label*w^Tx+b
label∗wTx+b都等于1,只有那些离分隔超平面最近点的值才为1。而离超平面越远的数据点,其
l
a
b
e
l
∗
w
T
x
+
b
label*w^Tx+b
label∗wTx+b值越大。
上述问题给定了一些约束条件求最优值,约束条件就是
l
a
b
e
l
∗
w
T
x
+
b
>
=
1
label*w^Tx+b >= 1
label∗wTx+b>=1。对于这类优化问题,可以使用著名的拉格朗日乘子法求解。这里的约束条件都是基于数据点的,因此可以将超平面写成数据点的形式,则优化目标函数最后可以写成:
m
a
x
α
[
∑
t
=
1
m
α
−
1
2
∑
i
,
j
=
1
m
l
a
b
e
l
(
i
)
∗
l
a
b
e
l
(
j
)
∗
α
i
∗
α
j
⟨
x
(
i
)
,
x
(
j
)
⟩
]
max_{\alpha}[\sum^m_{t=1}\alpha-\frac{1}{2}\sum^m_{i,j=1}label^{(i)}*label^{(j)}*\alpha_i*\alpha_j\langle x^{(i)}, x^{(j)}\rangle]
maxα[∑t=1mα−21∑i,j=1mlabel(i)∗label(j)∗αi∗αj⟨x(i),x(j)⟩],
⟨
x
(
i
)
,
x
(
j
)
⟩
\langle x^{(i)}, x^{(j)}\rangle
⟨x(i),x(j)⟩表示两者的内积。
其约束条件为:
α
≥
0
,
和
∑
i
=
1
m
α
i
∗
l
a
b
e
l
(
i
)
=
0
\alpha \ge0,和\sum^m_{i=1}\alpha _i*label^{(i)}=0
α≥0,和∑i=1mαi∗label(i)=0
Perfect。但是这里有个假设:数据必须是100%线性可分。我们知道所有数据都是不是那么‘干净’,可以通过引入松弛变量(slack variable),来允许有些数据点可以处于分割面的错误一侧,此时的约束条件可变为:
C
≥
α
≥
0
,
和
∑
i
=
1
m
α
i
∗
l
a
b
e
l
(
i
)
=
0
C \ge \alpha \ge0,和\sum^m_{i=1}\alpha _i*label^{(i)}=0
C≥α≥0,和∑i=1mαi∗label(i)=0,常数C用于控制“最大间隔”和“保证大部分点的函数间隔小于1”这两个目标的权重。
在求出所有
α
\alpha
α之后,分隔超平面就可以通过
α
\alpha
α表达。支持向量机(SVM)算法要做的就是求解这些
α
\alpha
α。
SMO高效优化算法
SMO(Sequence Minimal Optimization)是John Platt在1996年发布的用于训练SVM的强大算法。SMO将大的优化算法分解为多个小优化问题来求解。
SMO原理:每次循环中选择两个
α
\alpha
α进行优化处理,一旦找到合适的
α
\alpha
α,那么就增大其中一个同时减小另一个。这里所谓的合适是指两个
α
\alpha
α必须符合一定的条件,条件之一就是两个
α
\alpha
α要在间隔边界之外,条件二就是这两个
α
\alpha
α还没有进行过区间处理或者不在边界上。
SMO的算法实现代码较多,这里就不在贴出,可以在上面的github项目中找到详细解释(包括简化版和优化版)。
核函数
对于开头提到非线性可分的情况,是否存在某种模型,使其可以像线性可分的情况一样进行识别???答案是必须的。这就需要一种称为核函数的工具将数据转换成易于分类器理解的形式。
核函数类似于一个包装器或接口,可以将数据从一个特征空间映射到另一个特征空间,通常情况是将低维特征空间映射到高维特征空间,这样就能在高维特征空间中解决非线性问题。
SVM优化版代码中所有运算都可以写成内积的形式。我们就可以直接把内积运算换成核函数,就完成了数据变换。
不同的核函数介绍可以参考博客不同核函数介绍 和 核函数介绍 (手动感谢博主)