支持向量机(Support Vector Machine)是于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的泛化能力。本文仅做整理。由简至繁介绍SVM,SVM本质上是寻找在特征空间中寻找间隔最大化的分离超平面的线性分类器。
1、硬间隔SVM
对于二类分类问题,训练集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
T={(x_1,y_1),(x_2,y_2),⋯,(x_N,y_N)}
T=(x1,y1),(x2,y2),⋯,(xN,yN),其类别y_i∈{0,1},线性SVM通过学习得到分离超平面:
w
⋅
x
+
b
=
0
w⋅x+b=0
w⋅x+b=0
以及相应的分类决策函数:
f
(
x
)
=
s
i
g
n
(
w
⋅
x
+
b
)
f(x)=sign(w⋅x+b)
f(x)=sign(w⋅x+b)
当然,SVM线性分类器就是基于训练样本
T
T
T 在二维空间中找到一个超平面来分开二类样本。当然,这样的超平面有很多,如何寻找到最优超平面就是我们的目标。
由上图可以看出,当超平面离直线两边的数据的间隔最大,对训练集的数据的局限性或噪声有最大的“容忍”能力。
在这里,这个超平面可以函数
f
(
x
)
=
w
T
x
+
b
f(x)=w^Tx+b
f(x)=wTx+b表示的时候,肯定会有以下公式成立:
m
a
x
(
γ
)
max(γ)
max(γ)
s
.
t
.
y
i
⋅
(
w
T
x
i
+
b
)
≥
γ
s.t. y_i⋅(w^Tx_i+b)≥γ
s.t.yi⋅(wTxi+b)≥γ
公式可以转化为:
m
a
x
(
γ
∣
∣
w
∣
∣
)
max(\frac{γ}{||w||})
max(∣∣w∣∣γ)
s
.
t
.
y
i
⋅
(
w
T
x
i
+
b
∣
∣
w
∣
∣
)
≥
γ
∣
∣
w
∣
∣
s.t. y_i⋅(\frac{w^Tx_i+b}{||w||})≥\frac{γ}{||w||}
s.t.yi⋅(∣∣w∣∣wTxi+b)≥∣∣w∣∣γ
以上就是最大间隔分类器(Maximum Margin Classifier)
由于
γ
γ
γ是和
∣
∣
w
∣
∣
||w||
∣∣w∣∣相关的,不妨将其设置为1,以上公式可以变化为
m
a
x
(
1
∣
∣
w
∣
∣
)
max(\frac{1}{||w||})
max(∣∣w∣∣1)
s
.
t
.
y
i
⋅
(
w
T
x
i
+
b
)
≥
1
s.t. y_i⋅(w^Tx_i+b)≥1
s.t.yi⋅(wTxi+b)≥1
上公式可以转化为:
m
i
n
(
∣
∣
w
∣
∣
)
min(||w||)
min(∣∣w∣∣)
s
.
t
.
y
i
⋅
(
w
T
x
i
+
b
)
≥
1
s.t. y_i⋅(w^Tx_i+b)≥1
s.t.yi⋅(wTxi+b)≥1
这个就是SVM的基本型
我们可以看到,上面的基本型目标函数是二次的,约束条件是线性的,这是一个凸二次规划问题。我们可以添加拉格朗日乘子
a
i
≥
0
a^i ≥0
ai≥0转化为其“对偶问题”。
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
+
∑
i
=
1
m
a
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
L(w,b,α)= \frac{1}{2}||w||+\displaystyle\sum_{i=1}^{m} a^i(1-y_i(w^Tx_i+b))
L(w,b,α)=21∣∣w∣∣+i=1∑mai(1−yi(wTxi+b))
min
w
,
b
max
a
i
≥
0
L
(
w
,
b
,
α
)
\min \limits_{w,b}\max\limits_{a^i ≥0}L(w,b,α)
w,bminai≥0maxL(w,b,α)
满足KKT条件条件下,等价于
max
a
i
≥
0
min
w
,
b
L
(
w
,
b
,
α
)
\max\limits_{a^i ≥0}\min \limits_{w,b}L(w,b,α)
ai≥0maxw,bminL(w,b,α)
由高数知识可以知道,以上优化即将L(w,b,α)对w,b求偏导并令其等于0便可以得到最优解。
2软间隔线性SVM
硬间隔以为着所有样本点不能存在分错的情况,
线性不可分意味着有样本点可能会存在分错的情况,更通俗点,就是“你中有我,或者我中有你”,我们找不到一个超平面,完美得把两类数据严格地分开。
为了解决这个问题,对每个样本引入一个松弛变量
ξ
i
≥
0
ξ_i≥0
ξi≥0,所谓松弛变量表示样本离群的程度(该点到支持平面的距离),所以说松弛变量越大,离群越远,松弛变量为零,则样本没有离群。
所以上文中的约束条件
y
i
⋅
(
w
T
x
i
+
b
)
≥
1
y_i⋅(w^Tx_i+b)≥1
yi⋅(wTxi+b)≥1变为:
y
i
⋅
(
w
T
x
i
+
b
)
≥
1
−
ξ
i
y_i⋅(w^Tx_i+b)≥1-ξ_i
yi⋅(wTxi+b)≥1−ξi
目标函数则变为
m
i
n
(
∣
∣
w
∣
∣
)
+
C
∑
i
=
1
m
ξ
i
min(||w||)+C\displaystyle\sum_{i=1}^{m} ξ_i
min(∣∣w∣∣)+Ci=1∑mξi
s
.
t
.
y
i
⋅
(
w
T
x
i
+
b
)
≥
1
−
ξ
i
s.t. y_i⋅(w^Tx_i+b)≥1- ξ_i
s.t.yi⋅(wTxi+b)≥1−ξi
s
.
t
.
ξ
i
≥
0
s.t. ξ_i≥0
s.t.ξi≥0
拉格朗日对偶:
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
+
∑
i
=
1
m
a
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
+
C
∑
i
=
1
m
ξ
i
L(w,b,α)= \frac{1}{2}||w||+\displaystyle\sum_{i=1}^{m} a^i(1-y_i(w^Tx_i+b))+C\displaystyle\sum_{i=1}^{m} ξ_i
L(w,b,α)=21∣∣w∣∣+i=1∑mai(1−yi(wTxi+b))+Ci=1∑mξi
其中,C为惩罚函数,目标函数有两层含义:
margin尽量大,
误分类的样本点计量少
3非线性(nonlinear)SVM。
对于非线性问题,线性SVM不再适用了,需要非线性SVM来解决了。解决非线性分类问题的思路,我们可以引入核函数,在下图所示的例子中,通过空间变换,将左图中的椭圆分离面变换成了右图中直线。
z
(
1
)
=
x
(
1
)
2
z^{(1)}=x^{(1)2}
z(1)=x(1)2
z
(
2
)
=
x
(
2
)
2
z^{(2)}=x^{(2)2}
z(2)=x(2)2
所以说核函数其实就是低维空间映射到高维空间
x
→
ϕ
(
x
)
x→ϕ(x)
x→ϕ(x)
4调包实现
最简单的实现
from sklearn import svm
model = svm.SVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
参数说明如下:
C:惩罚项,float类型,可选参数,默认为1.0,C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
kernel:核函数类型,str类型,默认为’rbf’(高斯)。可选参数为:
‘linear’:线性核函数 ‘poly’:多项式核函数 ‘rbf’:径像核函数/高斯核 ‘sigmod’:sigmod核函数 ‘precomputed’:核矩阵。precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,核矩阵需要为n*n的。
degree:多项式核函数的阶数,int类型,可选参数,默认为3。这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。
gamma:核函数系数,float类型,可选参数,默认为auto。只对’rbf’ ,’poly’ ,’sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
coef0:核函数中的独立项,float类型,可选参数,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c。
probability:是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢。
shrinking:是否采用启发式收缩方式,bool类型,可选参数,默认为True。
tol:svm停止训练的误差精度,float类型,可选参数,默认为1e^-3。
cache_size:内存大小,float类型,可选参数,默认为200。指定训练所需要的内存,以MB为单位,默认为200MB。
class_weight:类别权重,dict类型或str类型,可选参数,默认为None。给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数’balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
verbose:是否启用详细输出,bool类型,默认为False,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。
max_iter:最大迭代次数,int类型,默认为-1,表示不限制。
decision_function_shape:决策函数类型,可选参数’ovo’和’ovr’,默认为’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。
random_state:数据洗牌时的种子值,int类型,可选参数,默认为None。伪随机数发生器的种子,在混洗数据时用于概率估计。