上篇博客讲到感知机是支持向量机(SVM)的基础。支持向量机同样采用分离超平面(或超曲面)来分离正负样本,故支持向量机是二分类分类器。支持向量机是一个非常广泛的领域,不是一两篇博客就能说清楚的,本文简单说下支持向量机的分类原理。支持向量机按简单到复杂分为线性可分支持向量机、线性支持向量机以及非线性支持向量机。
核心思想
找到分离超平面(超曲面),使得距离超平面最近的点到超平面距离最大。
与感知机的区别
两者同样是采用训练数据集训练模型,获取分离超平面。但感知机仅仅是分离而已,至于分离效果好不好无法保证,因此存在多个分离超平面来分离正负实例,而当样本无法线性分离时,该分离超平面不存在。
支持向量机不仅仅能分离,而且能使分离效果最好,那么分离效果最好如何衡量呢?即距离分离超平面最近的点到分离超平面距离最大。
线性可分支持向量机
同感知机模型,线性可分支持向量机只能处理线性可分的数据集,是最基础的支持向量机。
模型
基本概念
函数间隔:
γi^=yi(wxi+b)
γ
i
^
=
y
i
(
w
x
i
+
b
)
几何间隔:
γi=yi||w||(wxi+b)
γ
i
=
y
i
|
|
w
|
|
(
w
x
i
+
b
)
支持向量:与分离超平面距离最近的两个样本点(一正一负)
间隔边界:两个支持向量所在的平行的两个超平面
分离超平面:平行且位于两个间隔边界中央的超平面
线性可分支持向量机的模型就是基于分离超平面的决策函数
f(x)=sign(wx+b)
f
(
x
)
=
s
i
g
n
(
w
x
+
b
)
。
策略
找到分离超平面是一个含有不等式约束的最优化问题:
学习
求解上面的拉格朗日对偶问题的方法有很多,最常用的是序列最小最优化(SMO)算法,后面的博客会讲到。
线性支持向量机
线性支持向量机是考虑到数据集是线性不可分的,也就是说找不到分离超平面将正负实例完全分离开。这反映到上面的最优化问题上就是某些样本点不满足条件 yi(wxi+b)−1⩾0 y i ( w x i + b ) − 1 ⩾ 0 。解决方法就是引入软间隔,即允许样本点跨越间隔边界。反映到约束条件上就是:
线性支持向量机的支持向量没有线性可分情况下好理解,可以将支持向量分为 间隔边界上的支持向量、 间隔边界与分离超平面间的支持向量、 分离超平面上的支持向量和 误分一侧的支持向量。KKT条件中有如下两个条件
1.当 0<α<C 0 < α < C 时, μi μ i 不等于0,那么 ξi ξ i 一定等于0,即该支持向量位于间隔边界上。
2.当 α=C α = C 时,是分离比较糟糕的样本,支持向量不在正确一侧的间隔边界上。此时当 ξi<1 ξ i < 1 ,支持向量位于间隔边界与分离超平面间;当 ξi=1 ξ i = 1 ,支持向量位于分离超平面上;当 ξi>1 ξ i > 1 支持向量位于误分一侧。
非线性支持向量机
由于实际生活中绝大多数数据是不能简单地用超平面分离的,这时考虑建立超曲面。即首先将数据从当前空间非线性映射到另一个高维空间,在映射后的空间中,数据是能用超平面分离的,那么在这个空间中建立超平面方程后,再非线性变换回去即可(类似于拉普拉斯变换解决问题的思路)。但是这种方法,存在明显的缺点,首先映射函数的选择很困难,无法保证映射后是能用超平面分离的,其次计算量巨大。这就需要用到核技巧。
核技巧说白了就是偷个懒,无论在当前空间还是映射空间,我们都仅需要求解两个样本的内积,那么直接将变换来变换去的两个非线性变换的过程省略即可,即隐式地变换。具体实现就要引入核函数。例如核函数
K(xi,xj)=(xi⋅xj)2
K
(
x
i
,
x
j
)
=
(
x
i
·
x
j
)
2
,
xi和yi
x
i
和
y
i
在映射后空间的内积就是
(xi⋅xj)2
(
x
i
·
x
j
)
2
,至于隐藏在其中的非线性变换有很多种,具体是啥?权当是黑箱。
问题简单了,只需要将线性支持向量机优化问题中的内积
xi⋅xj
x
i
·
x
j
改成
K(xi,xj)
K
(
x
i
,
x
j
)
就可以了!
ν ν -支持向量机
上文讲到的支持向量机分类中涉及惩罚因子C,因此称为C-支持向量机,
ν
ν
-支持向量机是在C-支持向量机基础上添加了另外一个参数
ν
ν
来调节模型。
ν
ν
的含义就是训练错误样本占比上限,也即支持向量个数占比下限。由于
ν
ν
有明确的含义,调节起来比较方便。优化问题如下:可以看出,
ν
ν
-支持向量机是在C-支持向量机的基础上添加了一个参数
ρ
ρ
来调节支持向量的个数而已。默认的惩罚因子是
1l
1
l
,是可以另外设置的。(由于支持向量机是尺度可变的,故C的尺度依赖于输入数据的尺度,一般情况下可以将输入X的每个维度都归一化处理,sklearn和LIBSVM等支持向量包中C默认是1.0
我的GitHub
注:如有不当之处,请指正。