Datawhale学习笔记-吃瓜笔记:支持向量

支持向量与间隔

支持向量机(Support Vector Machine),这一名称是令人疑惑的,在这一章节里我们会解释这一名称与支持向量机的最基本模型。让我们先从线性二分类支持向量机开始
对于一个给定的训练样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } , y i ϵ { − 1 , + 1 } D=\left\{\left(\mathbf{x}_{1}, y_{1}\right),\left(\mathbf{x}_{2}, y_{2}\right), \ldots,\left(\mathbf{x}_{\mathbf{m}}, y_{m}\right)\right\}, y_{i} \epsilon\{-1,+1\} D={(x1,y1),(x2,y2),,(xm,ym)},yiϵ{1,+1} 现在我们要考虑在数据集 X X X 表示的一个高维空间中画出一个超平面来实现数据集中两个类型数据点的划分,为了方便表示,这里我们假设数据空间维度为2,用于划分的超平面为一条直线,可以作图如下
在这里插入图片描述

正如上图所示,对于一个线性可分问题来说,能够将两类样本分开的超平面(图中直线)往往不止一个,那么我们寻找哪一个比较好呢?在图中,直观上看来,应该去找位于两类训练样本“正中间“的那一条红色直线作为划分的超平面,因为该超平面对训练样本局部扰动的“容忍性“最好。例如,由于训练集的局限性或噪声的因素,测试集中的样本可能比图中训练集中的样本更加接近两个类的分隔界,这就有可能使得一些超平面出现划分错误的现象,在这种情况下,红色超平面会受到最小影响,换而言之,这个划分超平面所产生的分类结果是鲁棒的,对未见的测试点泛化性能最强

在样本空间中,划分超平面可通过如下的线性方程来描述

w T x + b = 0 w^Tx+b=0 wTx+b=0

其中 w = ( w i ; w 2 ; . . . ; w d ) w=(w_i;w_2;...;w_d) w=(wi;w2;...;wd)为超平面的法向量,决定了超平面的方向; b b b为位移项,决定了超平面和原点之间的距离。显然,划分超平面可以由 w w w b b b 唯一确定。我们现在来看,空间中任意一个样本点到达超平面的距离 λ \lambda λ , 假定对于一个点 x x x它投影到超平面上对应的点为 x 0 x_0 x0 .则根据平面几何的知识,我们可以得出

x = x 0 + λ w ∣ w ∣ x=x_{0}+\lambda \frac{\mathrm{w}}{|\mathbf{w}|} x=x0+λww

其中 ∣ ∣ w ∣ ∣ ||w|| w w w w的二范数 w ∣ w ∣ \frac{\mathrm{w}}{|\mathbf{w}|} ww可以理解为单位法向量,又因为 x 0 x_0 x0是超平面上的点,所以有 w T x 0 + b = 0 w^Tx_0+b=0 wTx0+b=0,用此式将 x 0 x_0 x0消去就可以得到点 x x x与超平面之间的距离关系

λ = w T x + b ∥ w ∥ \lambda=\frac{{\mathbf{w}}^{T} \mathbf{x}+b}{\|\mathbf{w}\|} λ=wwTx+b

为了得到距离,将上式取绝对值(或者乘上 y i ∈ { + 1 , − 1 } y_i\in\left\{+1,-1\right\} yi{+1,1}

λ = ∣ w T x + b ∣ ∥ w ∥ = ∣ f ( x ) ∣ ∣ ∣ w ∣ \lambda=\frac{\left|\mathbf{w}^{T} \mathbf{x}+b\right|}{\|\mathbf{w}\|}=\frac{|f(x)|}{|| \mathbf{w} \mid} λ=wwTx+b=wf(x)

在得到距离公式之后,我们假设超平面 ( w , b ) (w,b) (w,b)能将训练样本正确分类,,即对于任意 ( x i , y i ) (x_i,y_i) (xi,yi),若 y i = + 1 , 则 有 w T x + b > 0 y_i=+1,则有w^Tx+b>0 yi=+1,wTx+b>0,若 y i = − 1 y_i=-1 yi=1则有 w T x + b < 0 w^Tx+b<0 wTx+b<0,则可以表示如下

{ w T x + b > 0 , y i = + 1 w T x + b < 0 , y i = − 1 \left\{\begin{array}{l} \mathbf{w}^{\mathrm{T}} \mathbf{x}+b>0, y_{i}=+1 \\ \mathbf{w}^{\mathrm{T}} \mathbf{x}+b<0, y_{i}=-1 \end{array}\right. {wTx+b>0,yi=+1wTx+b<0,yi=1

我们现在可以看看下图,距离超平面最近的几个训练样本点可以使上式中的等式成立。它们被称为“支持向量“,两个异类支持点到超平面的距离之和为

γ = 2 ∥ w ∥ \gamma=\frac{2}{\|\mathbf{w}\|} γ=w2

称为“间隔”
在这里插入图片描述

现在建立优化目标方程,找到使间隔最大的划分超平面参数 ( w , b ) (w,b) (w,b)

obj ⁡ { max ⁡ w , b 2 ∥ w ∥  s.ty  ( w T x + b ) > = 1 , i = 1 , 2 , … , m \operatorname{obj}\left\{\begin{array}{r} \max _{\mathbf{w}, b} \frac{2}{\|\mathbf{w}\|} \\ \text { s.ty }\left(\mathbf{w}^{\mathrm{T}} \mathbf{x}+b\right)>=1, i=1,2, \ldots, m \end{array}\right. obj{maxw,bw2 s.ty (wTx+b)>=1,i=1,2,,m

显然,为了最大化间隔,仅需要最大化 ∣ ∣ w ∣ ∣ − 1 ||w||^{-1} w1 这等价于最小化 ∣ ∣ w ∣ ∣ 2 ||w||^2 w2,于是重写公式为

obj ⁡ { min ⁡ w , b 1 2 ∥ w ∥ 2  s.ty  i ( w T x + b ) > = 1 , i = 1 , 2 , … , m \operatorname{obj}\left\{\begin{array}{c} \min _{\mathbf{w}, b} \frac{1}{2}\|\mathbf{w}\|^{2} \\ \text { s.ty }_{i}\left(\mathbf{w}^{\mathrm{T}} \mathbf{x}+b\right)>=1, i=1,2, \ldots, m \end{array}\right. obj{minw,b21w2 s.ty i(wTx+b)>=1,i=1,2,,m

这就是支持向量机的基本模型,由上面的分析我们可以知道,模型的求解其实仅仅于“支持向量“的分布有关,而与其他训练点无关,“支持向量“的分布决定了超平面的划分,这也是“支持向量机“名称的由来

对偶问题

对偶问题是利用拉格朗日对偶性将原始问题转换为对偶问题,通过解对偶问题得到原始问题的解。优点是:

对偶问题往往更易于求解
自然引入核函数,推广到非线性分类问题的求解

若原始问题和对偶问题都有最优值,则对偶问题最优值 d ∗ ≤ d∗ ≤ d 原始问题最优值 p ∗ p* p

d ∗ = max ⁡ α , β : α i ≥ 0 min ⁡ x L ( x , α , β ) ≤ min ⁡ x max ⁡ α , β : α i ≥ 0 L ( x , α , β ) = p ∗ d^{*}=\max _{\alpha, \beta: \alpha_{i} \geq 0} \min _{x} L(x, \alpha, \beta) \leq \min _{x} \max _{\alpha, \beta: \alpha_{i} \geq 0} L(x, \alpha, \beta)=p^{*} d=maxα,β:αi0minxL(x,α,β)minxmaxα,β:αi0L(x,α,β)=p

对偶问题的代码实现

import numpy as np
import pylab as pl
from sklearn import svm

# we create 40 separable points
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0]*20 +[1]*20

#fit the model
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)

# get the separating hyperplane
w = clf.coef_[0]
a = -w[0]/w[1]
xx = np.linspace(-5, 5)
yy = a*xx - (clf.intercept_[0])/w[1]

# plot the parallels to the separating hyperplane that pass through the support vectors
b = clf.support_vectors_[0]
yy_down = a*xx + (b[1] - a*b[0])
b = clf.support_vectors_[-1]
yy_up = a*xx + (b[1] - a*b[0])

print ("w: ", w)
print ("a: ", a)

# print "xx: ", xx
# print "yy: ", yy
print ("support_vectors_: ", clf.support_vectors_)
print ("clf.coef_: ", clf.coef_)

# switching to the generic n-dimensional parameterization of the hyperplan to the 2D-specific equation
# of a line y=a.x +b: the generic w_0x + w_1y +w_3=0 can be rewritten y = -(w_0/w_1) x + (w_3/w_1)


# plot the line, the points, and the nearest vectors to the plane
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')

pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
          s=80, facecolors='none')
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)

pl.axis('tight')
pl.show()

运行结果

w:  [0.5405504  0.69198768]
a:  -0.7811561019145435
support_vectors_:  [[-0.34255362 -1.90163489]
 [-2.02280367 -0.58909734]
 [ 1.03187202 -0.08519102]]
clf.coef_:  [[0.5405504  0.69198768]]

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值