上篇我们探讨了线性支持向量机和线性可分支持向量机的原理,它们在线性可分的数据表现很好,但是没办法对线性不可分的数据进行分类。那么有没有一些技巧,让支持向量机也能处理线性不可分的书籍呢?本篇我们将探讨核技巧,以及应用核技巧的线性不可分支持向量机。
解决线性不可分问题的思路有两种,第一种是换更复杂的模型,如用神经网络模型;另一种是增加模型的复杂度,最常用的做法是,对特征进行升维。
1)多项式技巧
尽管线性SVM分类器在许多案例上表现出非常高效和出色,但是存在许多数据集并不是线性可分的。一种处理非线性可分的数据集的方式是增加更多的特征,比如多项式特征,在某些情况下可以变的线性可分。比如下图中,左图是只含有一个特征x1的简单数据集,该数据集不是线性可分的。但是如果你增加了第二个特征
x2=(x1)2,将数据映射二维空间中,你会神奇的发现,我们可以利用线性分类器进行分类了。
多项式特征很容易实现,不仅仅在SVM中,在各种机器学习算法都有不错的表现,但是在低次数的多项式不能处理非常复杂的数据集,而高次数的多项式又产生了巨大的特征数量,让模型变得更复杂,同时也让模型训练变慢甚至无法训练。
2)核技巧
非常幸运,有一个叫做核技巧(kernel trick)的神奇学习技巧。它可以像使用了增加多个多项式特征,甚至可以是高次数的多个多项式特征一样,效果一样的好,但它并不用增加任何的特征,不会产生特征爆炸问题。
核技巧的基本思想很简单,即把低维空间的线性不可分数据,转化到高维空间甚至无穷维度的空间,让它变得线性可分。
核技巧具体的意义在于,我们只需定义核函数
K(xi,xj),对于低维中的
xi,xj,有
K(xi,xj)=ϕ(xi)ϕ(xj)′,以避开分别计算
ϕ(x),甚至不用去关心
ϕ(x)长什么样,我们直接求
ϕ(xi)ϕ(xj)′的值,通常计算
ϕ(xi)ϕ(xj)′更容易。通俗可以理解成,核函数可以让模型好好享受在高维特征空间线性可分的红利,却避免了高维特征空间恐怖的内积计算量。因此,核函数需要特殊的构造,下面我们探讨下常用的核函数。
3)常用核函数
核函数的种类有很多,Scikit-Learn常用的核函数有一下几种:
- 线性核函数
K(xi,xj)=xi⋅xj′
- 多项式核函数
K(xi,xj)=(xi⋅xj′+c)d
- 高斯核函数
K(xi,xj)=exp(−γ∣∣xi−xj∣∣2)
- 拉普拉斯核函数
K(xi,xj)=exp(∣∣xi−xj∣∣)
- Sigmoid核函数
K(xi,xj)=tanh(xi⋅xj+c)
对于核函数的选择,可以根据数据本身进行选择。如果特征的数量很大,跟样本数量差不多,优先考虑使用线性核函数;如果特征数量比较小,样本数量一般,不算大也不算小,优先考虑使用高斯核函数;如果特征的数量比较小,而样本数量很多,可以考虑手工增加特征,使用用线性核函数。
在SVM中,选择线性核函数和高斯核函数时,需要对数据进行归一化处理。
4)线性不可分支持向量机
上篇我们讲到线性可分支持向量机的目标函数为:
minimize2∣∣w∣∣22
s.t.
(wTxi+b)yi≥1
为了后面更直观的探讨核技巧,我们现在用
ϕ(xi)代替
xi,
ϕ(xi)为映射到高维的函数。目标函数变为:
minimize2∣∣w∣∣22
s.t.
(wTϕ(xi)+b)yi≥1
由于目标函数
2∣∣w∣∣22是凸函数,同时约束条件不等式是仿射的,根据凸优化理论,我们可以通过拉格朗日函数将我们的优化目标转化为无约束的优化函数,目标函数变为:
L(w,b,α)=2∣∣w∣∣22+∑i=1mαi(1−yi(wTϕ(xi)+b)),
αi≥0
引入了朗格朗日乘子,我们的优化目标变成:
minw,bmaxαL(w,b,α)
目标函数满足KKT条件,即满足拉格朗日对偶,我们的优化问题可以转化为等价的对偶问题来求解。即:
maxαminw,bL(w,b,α)
从上式中,我们可以先求目标函数对于w和b的极小值。接着再求拉格朗日乘子α的极大值。
∂(w)∂(L)=w−∑i=1mαiyiϕ(xi)=0⇒w=∑i=1mαiyiϕ(xi)
∂(b)∂(L)=∑i=1mαiyi=0⇒∑i=1mαiyi=0
求出w和α 的关系,就可以带入优化函数
L(w,b,α)消去w了。
L(w,b,α)=2∣∣w∣∣22+∑i=1mαi(1−yi(wTϕ(xi)+b))
=21wTw−wT∑i=1mαiyiϕ(xi)+∑i=1mαi−b∑i=1mαiyi
=21wT∑i=1mαiyiϕ(xi)−wT∑i=1mαiyiϕ(xi)+∑i=1mαi−b0
=∑i=1mαi−21wT∑i=1mαiyiϕ(xi)
=∑i=1mαi−21(∑i=1mαiyiϕ(xi))T∑i=1mαiyiϕ(xi)
=
∑i=1mαi−21∑i,j=1mαiαjyiyjϕ(xi)Tϕ(xj)
argmaxα=∑i=1mαi−21∑i,j=1mαiαjyiyjϕ(xi)Tϕ(xj)
再对
α求最大值,
argmaxα=∑i=1mαi−21∑i,j=1mαiαjyiyjϕ(xi)Tϕ(xj)
s.t.
∑i=1mαiyi=0 ,
αi≥0,i=1,2...m
习惯求取最小值,添加负号,
argminα=21∑i,j=1mαiαjyiyjϕ(xi)Tϕ(xj)−∑i=1mαi
s.t.
∑i=1mαiyi=0 ,
αi≥0,i=1,2...m
通过SMO算法,得到了最优解α∗,代入
w,b中,得:
w∗=∑i=1mαi∗yiϕ(xi)
b∗=yi−∑i=1mαi∗yiϕ(xi)ϕ(xj)
让我们再回到目标函数
argminα=21∑i,j=1mαiαjyiyjϕ(xi)Tϕ(xj)−∑i=1mαi
s.t.
∑i=1mαiyi=0 ,
αi≥0,i=1,2...m
正常情况下,我们需要知道映射函数
ϕ(x),并将数据映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无法计算。
因此,我们在SVM中引入核函数的机制。我们定义核函数
K(xi,xj)=ϕ(xi)ϕ(xj)′。我们在低维空间进行
K(xi,xj)计算,避免了在高维维度空间计算内积的恐怖计算量。从另一个角度可以认为
K(xi,xj)是去求
xi,yii之间的相似度,这个相似度函数即为核函数。
5)SVM小结
SVM算法的主要优点有:
- 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
- 仅仅使用一部分支持向量来做超平面的决策,无需依赖全部数据。
- 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
- 分类准确率高,泛化能力强。
SVM算法的主要缺点有:
- SVM在样本量非常大,核函数映射维度非常高时,计算量过大,耗时交久。
- 无法直接支持多分类,但是可使用多个二分类实现。
- SVM对缺失数据敏感
(欢迎转载,转载请注明出处。)