线性SVM
SVM的优化目标是最大化分类边距,边距是指两个分离的超平面(决策边界)间的距离,位于分类边距上的数据点成为支持向量。图中蓝线所指的就是支持向量。
计算边距的大小:
设分类的超平面为:
g(x)=wTx+b=0
支撑超平面为g(x)=±c,令c=1:
{wTxi+b⩾1,yi=+1wTxi+b⩽−1,yi=−1
虽然在这里假设c=1,所求得的(w,b)若能正确分类,总存在缩放变换: w→ζw,b→ζb使得上式成立。
由样本到超平面的距离公式:
d=∣∣w∣∣∣g(x)∣
分类间隔为:
∣∣w∣∣∣+1∣+∣∣w∣∣∣−1∣=∣∣w∣∣2
SVM的学习过程归结为寻找合适的w和b:
- 所有的训练数据都在正确的分类区域
yi(⟨w,xi⟩+b)≥1,其中yi∈{−1,+1}
- 最大化边距:max∥w∥2⇔min21∥w∥2
目标函数可以被整理成为如下的格式:
w,bmin21∣∣w∣∣2s.t. yi(wTxi+b)≥1,i=1,2,...,n
此时可以使用在约束g(x)≤0下最小化f(x)的拉格朗日乘数法,此时需要转化为如下的KKT约束条件:
⎩⎨⎧g(x)⩽0λ⩾0λg(x)=0
每条约束添加拉格朗日乘子αi⩾0,该问题的拉格朗日函数可写为:L(w,b,α)=21∣∣w∣∣2+i=1∑nαi(1−yi(wTxi+b))
原始问题:minw,bθp(w,b)=minw,bmaxαi⩾0L(w,b,α)=p∗
对偶问题:maxαθd(α)=maxαi⩾0minw,bL(w,b,α)=d∗
从以上可以看出,原始问题先固定α优化w,b,求出w,b再优化α。对偶问题先固定w,b优化α,求出α后在优化w,b。采用其对偶问题,先固定先固定w,b:
∂w∂L(w,b,α)=0⇒w=i=1∑nαiyixi∂b∂L(w,b,α)=0⇒0=i=1∑nαiyi
将以上两式子带入L(w,b,α)可得:
21∣∣x∣∣2=21i=1∑nj=1∑nαiαjyiyjxiTxj−i=1∑nαi(1−yi(wTxi+b))=−i=1∑nj=1∑nαiαjyiyjxiTxj+i=1∑nαi
得到θd(α)=∑i=1nαi−21∑i=1n∑j=1nαiαjyiyjxiTxj
此时需要求解如下关于α目标函数:
αmaxi=1∑nαi−21i=1∑nj=1∑nαiαjyiyjxiTxjs.t. i=1∑nαiyi=0,αi⩾0,i=1,2,...,n
解出α后,求出w,b:
w=i=1∑nαiyixiyj(wTxj+b)−1=0{j∣αj>0}⇒b=yj−i=1∑nαiyixiTxj
即可得到模型:
f(x)=wTx+b=i=1∑nαiyixiTx+b
上述过程需满足KKT条件:
⎩⎨⎧yif(xi)−1⩾0αi⩾0αi(yif(xi)−1)=0
从KKT条件中可以看出,对于∀(xi,yi),必有αi=0或yif(xi)=1。αi=0时样本对f(x)没有影响,当αi>0时,必有yif(xi)=1。所以最终的模型只和支持向量有关。
非线性SVM:核函数法
可将样本映射到高维空间中,使得在低维空间线性不可分的样本在高维空间线性可分。
设ϕ(x)为x映射后的特征向量,在特征空间中划分超平面的模型为f(x)=wTϕ(x)+b
此时的对偶问题是:
αmaxi=1∑nαi−21i=1∑nj=1∑nαiαjyiyjϕ(xi)Tϕ(xj)s.t. i=1∑nαiyi=0,αi⩾0,i=1,2,...,n
由于特征空间可能维度很高,甚至是无穷维,内积运算ϕ(xi)Tϕ(xj)比较困难。此时可以设想一个核函数:
κ(xi,xj)=ϕ(xi)Tϕ(xj)
有了核函数,就无需再求高维甚至无穷维特征空间的内积,目标函数可写为:
αmaxi=1∑nαi−21i=1∑nj=1∑nαiαjyiyjκ(xi,xj)s.t. i=1∑nαiyi=0,αi⩾0,i=1,2,...,n
解出α后,求出w,b:
w=i=1∑nαiyixiyi(wTxi+b)−1=0{i∣αi>0}⇒b=yj−i=1∑nαiyiκ(xi,xj)
f(x)=wTx+b=i=1∑nαiyiϕ(xi)Tϕ(x)+b=i=1∑nαiyiκ(xi,x)+b
核函数:
若已知合适的映射ϕ(⋅),则可写出核函数κ(⋅)。在现实任务中我们通常不知道ϕ(⋅)的形式,我们有以下定理可以选择核函数。
X为输入空间,κ(⋅,⋅)是定义在X×X的对称函数,则κ是核函数当且仅当对于任意数据D={x1,x2,...,xm},核矩阵K总是半正定的。
矩阵正定的定义: 对于实对称矩阵A,如果对于任意的非0向量x∈Rn̸=0,有xTAx>0,则矩阵A是正定的。其充要条件是矩阵A对应的特征值全是正数。
上述的定理表明,对于任意一个对称函数所对应的核矩阵半正定,就能作为核函数使用,同时也隐式对应映射函数ϕ。
我们希望样本在特征空间里线性可分,特征空间的好坏对SVM的性能很重要。在不知道特征映射的情况下,我们并不知道什么样的核函数是最适合的,核函数隐式的定义了特征空间。于是核函数的选择成为SVM的最大变数。若核函数选择不合适,样本会映射到一个不合适的空间,进而导致性能不佳。
常用的核函数:
新的核函数也可以通过组合核函数得到:
- 若κ1和κ2为核函数,对于任意正数γ1和γ2,其线性组合γ1κ1+γ2κ2也是核函数。
- 若κ1和κ2为核函数,则核函数的直积(笛卡尔积)κ1(x,z)κ2(x,z)也是核函数。
- 若κ1为核函数,则对于任意函数g(x) $κ(x,z)=g(x)κ1(x,z)g(z)
软边距的SVM
如果不存在一个分类面使得训练数据能够被完美分开,或者为了防止由于过拟合而造成的线性可分,那么边距不再是硬性限制(软边距),此时允许一些样本分类错误。这些样本不必满足:
yi(wTxi+b)≥1
此时需要在优化目标中加入对错误样本的惩罚,错误惩罚为出错数据点与分类面的距离。如果不加入惩罚项,支持向量会变为最外侧的样本点,造成分类失败;加入惩罚项,会在最大边距与错误样本惩罚项之间得到权衡。
优化目标:w,b,ξimin21∣∣w∣∣2+Ci=1∑nξis.t. yi(wTxi+b)≥1−ξiξi≥0,i=1,2,...,n
例如可以使用hinge函数:l(z)=max(0,1−z)
此时优化函数可写为:
w,b,ξimin21∣∣w∣∣2+Ci=1∑nmax(0,1−yi(wTxi+b))
其中参数C是一个权衡,C变大,牺牲了分类间隔,减少了训练集错误。
对偶问题为:
目标函数可写为:
αmaxi=1∑nαi−21i=1∑nj=1∑nαiαjyiyjκ(xi,xj)s.t. i=1∑nαiyi=0,0≤αi≤C,i=1,2,...,n
可以看出,与软间隔的目标函数相比,变化只有增加了αi≤C。
f(x)=wTx+b=i=1∑nαiyiϕ(xi)Tϕ(x)+b=i=1∑nαiyiκ(xi,x)+b
利用线性SVM对鸢尾花数据集进行分类:
from sklearn.svm import SVC
import numpy as np
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
svm = SVC(kernel='linear', C=1.0, random_state=0)
svm.fit(X_train_std, y_train)