排序算法模型(5):支持向量机(SVM)

支持向量机(Support Vector Machine)是一种十分常见的分类器,曾经火爆十余年,分类能力强于NN,整体实力比肩LR与RF。核心思路是通过构造分割面将数据进行分离。本文主要阐述SVM的基本工作原理和简单应用。

SVM的分类

线性可分SVM

线性可分SVM的原理是要达到硬边界最大化。这里的线性可分是指,当我们想用一个分割平面,将两个数据分割开时,存在至少一个分割面,使两个数据可以完全分离,则我们认为这个SVM是线性可分SVM。

线性SVM

线性SVM是指,分割面虽然不能完全分割所有数据,但是该线性分割方式可以使绝大多数数据正确的被分类。那么这样的SVM也可以被称为线性SVM。线性SVM要达到的是软边界最大化。这里的“软”对应线性可分SVM的“硬”。硬边界指的是支持向量到分割面的距离,因为支持向量距离分割面最近,该距离也是过渡带宽度(的一半)。而软边界指的是,当SVM不是线性可分的情况时,此时支持向量并不一定是距离分割面最近的向量。因此SVM此时并不能一味地边界最大化,而是使过渡带足够宽。此时的边界最大化并不是真正意义上的,严格的边界最大化。所以用软进行区分。

非线性SVM

对于前两种SVM,对其加入一个核函数就可以构造出非线性SVM。

SVM原理

超平面

在二维空间里,对于一条直线: w 1 x 1 + w 2 x 2 + b = 0 w_1x_1+w_2x_2+b=0 w1x1+w2x2+b=0 ( w 1 , w 2 ) (w_1, w_2) (w1,w2)实际上就是直线的法线方向。如果我们代入 ( x 1 , x 2 ) (x_1, x_2) (x1,x2)到等式左边,则当该式大于0时,点 X X X在法线正方向上,小于0时则在法线负方向上,等于0则在法线上。将这一性质应用于更高维度的话,此时点 X X X就是一个 n n n维向量,而这条直线也就变为超平面了。

法线与向量之间的位置关系

支持向量

支持向量怎么选择?以线性可分SVM为例,我们将 w w w认为是若干样本线性组合得到的,第 1 1 1个样本为 x 1 x_1 x1,第 i i i个为 x i x_i xi。对于每个 x x x,给予其系数 α \alpha α,此时存在: w ⃗ = ∑ i n α i x ( i ) \vec w=\sum^n_i\alpha_ix^{(i)} w =inαix(i),选取部分 α \alpha α,使它们的值不为 0 0 0,其余值都设为 0 0 0。则对 w w w真正起作用的就是值不为 0 0 0的这些 x x x向量。这些向量,支持了法线向量,因此就是支持向量。
分隔方式很多,但是哪一种最好呢呢?
若直线 l l l有参数 w w w b b b,通过计算每个样本到直线 l l l距离,衡量哪条直线是最为合适的分割线。距离 d d d可以表示为: d = w x ( i ) + b ∥ w ∥ d=\frac {wx^{(i)}+b}{\Vert w\Vert} d=wwx(i)+b,若每个数据集中样本的形式为 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 y y值,就是这个样本的label。正例为 1 1 1,负例为 − 1 -1 1。这里的正负值其实反映的就是样本位于分割线的方向。位于法线正方向即为正。将 y y y值一起乘入等式右边: d = w x ( i ) + b ∥ w ∥ y ( i ) d=\frac {wx^{(i)}+b}{\Vert w\Vert}y^{(i)} d=wwx(i)+by(i),这里的 y y y值是样本的实际正负值,如果估计值与实际值符号相同,即分类正确,此时的结果为正值。如果分类错误,则结果为负值。

构造分割面

在所有样本中,距离该直线最近的样本应被选为支持向量。支持向量与直线间的距离即为过渡带。因为SVM期望过渡带尽可能大,因此最终参数 w w w b b b的选择可以表示为:
w ∗ , b ∗ = arg max ⁡ ( min ⁡ i = 1 , 2 , . . . , n w x ( i ) + b ∥ w ∥ y ( i ) ) w^*,b^*=\argmax (\min_{i=1,2,...,n}\frac{wx^{(i)}+b}{\Vert w\Vert}y^{(i)}) w,b=argmax(i=1,2,...,nminwwx(i)+by(i))
因此,给定线性可分训练数据集,通过间隔最大化得到的分割超平面为: y ( x ) = w T Φ ( x ) + b y(x)=w^T\Phi(x)+b y(x)=wTΦ(x)+b,相应的分类决策函数为: f ( x ) = s i g n ( w T Φ ( x ) + b ) f(x)=sign(w^T\Phi(x)+b) f(x)=sign(wTΦ(x)+b)

目标函数

对于线性可分SVM而言,目标函数实际上就是分割平面的选取,因此目标函数实际上就是:
w ∗ , b ∗ = arg max ⁡ w , b ( 1 ∥ w ∥ min ⁡ i = 1 , 2 , . . . , n ( y ( i ) w x ( i ) + b ) ) w^*,b^*=\argmax_{w,b} (\frac{1}{\Vert w\Vert}\min_{i=1,2,...,n}(y^{(i)}wx^{(i)}+b)) w,b=w,bargmax(w1i=1,2,...,nmin(y(i)wx(i)+b))
对于上式,在不改变分割面位置的情况下,总存在一个 w w w值,使距离该直线最近的向量到直线距离为 1 1 1。因此上式中,最小值部分可以始终取 1 1 1。此时的 W W W值,实际上才是目标函数本身,此时存在约束条件: y ( i ) ( W T Φ ( x ( i ) ) + b ) ≥ 1 y^{(i)}(W^T\Phi(x^{(i)})+b)\ge1 y(i)(WTΦ(x(i))+b)1。因此,通过拉格朗日乘子法可以对目标函数求极值:
max ⁡ w , b 1 ∥ w ∥ , s . t .   y ( i ) ( W T Φ ( x ( i ) ) + b ) ≥ 1 ,   i = 1 , 2 , . . . , n \max_{w,b}\frac{1}{\Vert w\Vert}, \\s.t. \ y^{(i)}(W^T\Phi(x^{(i)})+b)\ge1, \ i=1, 2, ..., n w,bmaxw1,s.t. y(i)(WTΦ(x(i))+b)1, i=1,2,...,n
变形后可得:
min ⁡ w , b 1 2 ∥ w ∥ 2 , s . t .   y ( i ) ( W T Φ ( x ( i ) ) + b ) ≥ 1 ,   i = 1 , 2 , . . . , n \min_{w,b}\frac{1}{2}\Vert w\Vert^2, \\s.t. \ y^{(i)}(W^T\Phi(x^{(i)})+b)\ge1, \ i=1, 2, ..., n w,bmin21w2,s.t. y(i)(WTΦ(x(i))+b)1, i=1,2,...,n
对目标函数使用拉格朗日乘子法:
L ( w , b , a ) = min ⁡ w , b 1 2 ∥ w ∥ 2 + ∑ i = 1 n a ( i ) ( 1 − y ( i ) ( w T Φ ( x ( i ) ) + b ) ) , s . t .   1 − y ( i ) ( W T Φ ( x ( i ) ) + b ) ≤ 0 ,   i = 1 , 2 , . . . , n L(w, b, a)=\min_{w,b}\frac{1}{2}\Vert w\Vert^2+\sum^n_{i=1}a^{(i)}(1-y^{(i)}(w^T\Phi(x^{(i)})+b)), \\ s.t. \ 1-y^{(i)}(W^T\Phi(x^{(i)})+b)\le0, \ i=1, 2, ..., n L(w,b,a)=w,bmin21w2+i=1na(i)(1y(i)(wTΦ(x(i))+b)),s.t. 1y(i)(WTΦ(x(i))+b)0, i=1,2,...,n
这里的 w w w b b b是原始的参数,而 a a a是引入的参数且大于等于 0 0 0。为了方便整理与化简,接下来对 L L L求偏导并使偏导为0:
∂ L ∂ w = w − ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) = 0 \frac{\partial L}{\partial w}=w-\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)})=0 wL=wi=1na(i)y(i)Φ(x(i))=0
解得:
w = ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) ∂ L ∂ b = − ∑ i = 1 n a ( i ) y ( i ) = 0 \begin{aligned} w&=\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)}) \\ \frac{\partial L}{\partial b}&=-\sum^n_{i=1}a^{(i)}y^{(i)}=0 \end{aligned} wbL=i=1na(i)y(i)Φ(x(i))=i=1na(i)y(i)=0
根据上式, a a a等于 0 0 0的时候可知其对 w w w b b b无作用。因此,真正的支持向量,是那些不为 0 0 0的向量。

这里给出一个通过凸优化后最终得到的求的式子:
a ∗ = arg max ⁡ a ( ∑ i = 1 n a ( i ) − 1 2 ∑ i , j = 1 n a ( i ) a ( j ) y ( i ) y ( j ) Φ T ( x ( i ) ) Φ T ( x ( j ) ) ) a^*=\argmax_a(\sum^n_{i=1}a^{(i)}-\frac{1}{2}\sum^n_{i, j=1}a^{(i)}a^{(j)}y^{(i)}y^{(j)}\Phi^T(x^{(i)})\Phi^T(x^{(j)})) a=aargmax(i=1na(i)21i,j=1na(i)a(j)y(i)y(j)ΦT(x(i))ΦT(x(j)))
求出 a a a之后回代可得 w w w b b b
w ∗ = ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) b ∗ = y ( i ) − ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) Φ ( x ( j ) ) \begin{aligned} w^*&=\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)}) \\ b^*&=y^{(i)}-\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)})\Phi(x^{(j)}) \end{aligned} wb=i=1na(i)y(i)Φ(x(i))=y(i)i=1na(i)y(i)Φ(x(i))Φ(x(j))

松弛因子

对于线性SVM而言,因为不要求所有样本都被分对,因此其约束条件和线性可分SVM并不相同。给出一个大于等于 0 0 0的松弛因子 ξ \xi ξ,使函数间隔加上松弛因子后大于等于 1 1 1,此时有目标函数及约束条件:
min ⁡ w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ ( i ) , s . t .   y ( i ) ( W T Φ ( x ( i ) ) + b ) ≥ 1 − ξ ( i ) ,   i = 1 , 2 , . . . , n \min_{w,b}\frac{1}{2}\Vert w\Vert^2+C\sum^n_{i=1}\xi^{(i)}, \\ s.t. \ y^{(i)}(W^T\Phi(x^{(i)})+b)\ge1-\xi^{(i)}, \ i=1, 2, ..., n w,bmin21w2+Ci=1nξ(i),s.t. y(i)(WTΦ(x(i))+b)1ξ(i), i=1,2,...,n
上式中, C C C是一个控制松弛因子权重的参数。当 C C C足够大时, ξ \xi ξ只能趋近于0,变回线性可分SVM。因此上式也可以被看作是线性可分SVM的扩展。松弛项可以被理解为线性回归中的正则项, C C C的值越小,过渡带越宽, C C C的值越大,过渡带越窄。这也使得线性SVM具备更强的泛化性。

同样的,对于线性SVM的目标函数及其约束条件使用拉格朗日乘子法后,求偏导可得:
L ( w , b , ξ , a , μ ) = 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ ( i ) + ∑ i = 1 n a ( i ) ( 1 − y ( i ) ( w T Φ ( x ( i ) ) + b ) − ξ ( i ) ) − ∑ i = 1 n μ ( i ) ξ ( i ) L(w,b,\xi,a,\mu)=\frac{1}{2}\Vert w\Vert^2+C\sum^n_{i=1}\xi^{(i)}+\sum^n_{i=1}a^{(i)}(1-y^{(i)}(w^T\Phi(x^{(i)})+b)-\xi^{(i)})-\sum^n_{i=1}\mu^{(i)}\xi^{(i)} L(w,b,ξ,a,μ)=21w2+Ci=1nξ(i)+i=1na(i)(1y(i)(wTΦ(x(i))+b)ξ(i))i=1nμ(i)ξ(i)
∂ L ∂ w = w − ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) = 0 w = ∑ i = 1 n a ( i ) y ( i ) Φ ( x ( i ) ) ∂ L ∂ b = − ∑ i = 1 n a ( i ) y ( i ) = 0 ∂ L ∂ ξ = C − a ( i ) − μ ( i ) \begin{aligned} \frac{\partial L}{\partial w}&=w-\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)})=0 \\ w&=\sum^n_{i=1}a^{(i)}y^{(i)}\Phi(x^{(i)}) \\ \frac{\partial L}{\partial b}&=-\sum^n_{i=1}a^{(i)}y^{(i)}=0 \\ \frac{\partial L}{\partial\xi}&=C-a^{(i)}-\mu^{(i)} \end{aligned} wLwbLξL=wi=1na(i)y(i)Φ(x(i))=0=i=1na(i)y(i)Φ(x(i))=i=1na(i)y(i)=0=Ca(i)μ(i)
这里直接给出 a a a最后的求解形式:
a ∗ = arg min ⁡ a ( ∑ i = 1 n a ( i ) − 1 2 ∑ i , j = 1 n a ( i ) a ( j ) y ( i ) y ( j ) Φ T ( x ( i ) ) Φ T ( x ( j ) ) ) s . t .   ∑ i = 1 n a ( i ) y ( i ) = 0 0 ≤ a ( i ) ≤ C ,   i = 1 , 2 , . . . , n a^*=\argmin_a(\sum^n_{i=1}a^{(i)}-\frac{1}{2}\sum^n_{i,j=1}a^{(i)}a^{(j)}y^{(i)}y^{(j)}\Phi^T(x^{(i)})\Phi^T(x^{(j)})) \\ s.t. \ \sum^n_{i=1}a^{(i)}y^{(i)}=0 \\ 0\le a^{(i)}\le C, \ i=1,2,...,n a=aargmin(i=1na(i)21i,j=1na(i)a(j)y(i)y(j)ΦT(x(i))ΦT(x(j)))s.t. i=1na(i)y(i)=00a(i)C, i=1,2,...,n

损失函数

SVM的损失,通常被定义为没有被正确分在过渡带外面的向量,到过渡带边界的距离。位于过渡带内的样本,损失为 1 − d 1-d 1d d d d是该样本到分割面的距离。注意,如果是在“本方”过渡带,则 d d d为正值。如果已经越过分割面了,则 d d d值变为负值。这个损失也被称为Hinge损失。因此损失函数可以被写成:
L o s s ( w , b ) = ∑ i = 1 n ξ ( i ) Loss(w,b)=\sum^n_{i=1}\xi^{(i)} Loss(w,b)=i=1nξ(i)
换句话说,松弛因子本身可以被看作是损失的衡量。因为松弛因子本身也是包容分割面的分割错误。实际上,损失本身,就是由于线性SVM允许过渡带内存在向量,甚至向部分错误分类的向量妥协的结果。因此,原目标函数变为:
min ⁡ w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ ( i ) \min_{w,b}\frac{1}{2}\Vert w\Vert^2+C\sum^n_{i=1}\xi^{(i)} w,bmin21w2+Ci=1nξ(i)
某种意义上,可以认为是Hinge损失加上一个 l 2 l_2 l2正则。

核函数

核函数可以说是SVM的精髓所在,其目的在于,通过将原始输入空间映射到更高维度的特征空间这一操作,原本线性不可分的样本可以在新的核空间内变为线性可分。常见的核函数有:

  • 多项式核函数: k ( x 1 , x 2 ) = ( x 1 T x 2 + c ) d k(x_1,x_2)=(x_1^Tx_2+c)^d k(x1,x2)=(x1Tx2+c)d
  • RBF核函数: k ( x 1 , x 2 ) = e − ∥ x 1 − x 2 ∥ 2 2 σ 2 k(x_1,x_2)=e^{-\frac{\Vert x_1-x_2\Vert^2}{2\sigma^2}} k(x1,x2)=e2σ2x1x22
  • Sigmoid核函数: k ( x 1 , x 2 ) = tanh ⁡ ( x 1 T x 2 + c ) k(x_1,x_2)=\tanh(x_1^Tx_2+c) k(x1,x2)=tanh(x1Tx2+c)
    从多项式核函数讲起,最基本的, c c c等于 0 0 0 d d d等于 2 2 2的情况下,kernel使原有的两个变量两两相乘。这相当于将维度数量平方了。规模上,特征数目变为平方级,而计算复杂度并没有显著上升。

RBF则是固定每一个 x i x_i xi,对于变化的 x j x_j xj,以 x i x_i xi为中心做指数级衰减。相当于是以 x i x_i xi为中心,做高斯分布。因此被称作高斯核函数。对于每个样本的label而言,正例被核函数向上拉升,负例向下延伸。从而使数据分离。使用RBF在高维空间分割数据
分离后的数据,可以被多个分割面分离,我们要选取的,实际上就是使距离分割面最近的样本距离尽可能大的分割方式。因此最终的超平面选取还是使用线性SVM的思路。RBF的维度映射可以被理解是无穷维的,因为在数学上,RBF的指数可以被泰勒展开。展式中的每一项,都可以被理解为该维度上的样本分离。因为其强力的高维映射能力,RBF往往是首选核函数。

Iris数据分类代码

数据选用的是Iris数据集,代码如下:

import sklearn.datasets
import numpy as np
import pandas as pd
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = sklearn.datasets.load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris['data'], iris['target'], random_state=1, train_size=0.8)

svm_model = svm.SVC(C=0.5, kernel='linear', decision_function_shape='ovr')
svm_model.fit(x_train, y_train.ravel())

print(accuracy_score(y_train, svm_model.predict(x_train)))
print('Accuracy:', accuracy_score(y_test, svm_model.predict(x_test)))
print(y_test.ravel())
print(svm_model.predict(x_test))

总结

SVM可以说是泛化能力很强的优质分类器,准确率也很高。相比于LR和RF,SVM难点在于调参。RF更多的注重效率,在模型训练以及特征选择上省下了大把时间。LR学习速率也快于SVM,比较通用,精确度和效率都不错。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值