机器学习入门学习笔记(五)支持向量机

分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开。

1、超平面

在样本空间中,划分超平面可通过如下线性方程来描述:wTx+b=0
其中 w= (w1; w2; ……; wd) 为法向量,决定了超平面的方向;b为位移项,决定了超平面与原点之间的距离。

问题:能将训练样本分开的划分超平面可能有很多,如何选择?
在这里插入图片描述
直观上看,应该去找位于两类训练样本 “正中间” 的划分超平面,即图6.1中最粗的那个,因为该划分超平面对训练样本局部扰动的“容忍”性最好,即鲁棒性最好,对未见示例的泛化能力最强。

问题:如何选出 “正中间 ”的那个超平面?(用什么方法)

2、支持向量与间隔

样本空间中任意点 x 到超平面的距离可写为:(点到平面距离公式)
在这里插入图片描述
超平面能将训练样本正确分类时,对于样本 (xi,yi) ∈ D有:
若 yi = +1(正类), 则有 wTx+b > 0;
若 yi = -1(反类), 则有 wTx+b < 0。

如下图6.2所示,距离超平面最近的这几个训练样本点使式(6.3)的等号成立,它们被称为“支持向量”(support vector)。
在这里插入图片描述
“间隔”(margin):两个异类支持向量到超平面的距离之和,如下式。
在这里插入图片描述
在这里插入图片描述
欲找到具有“最大间隔”(maximum margin)的划分超平面,也就是要找到能满足式(6.3)中约束的参数 w 和b,使得 γ(间隔) 最大,写成以下的优化问题描述。
在这里插入图片描述
显然,为了最大化间隔,仅需最大化||w||-1,这可以等价于最小化 ||w||2。于是,优化问题的描述可重写为
在这里插入图片描述
这就是支持向量机(Support Vector Machine,简称SVM)的基本型。

问题:有了选出超平面的基本方法,接下来就是如何解的问题。

3、对偶问题

介绍:对偶问题属于凸优化问题。Lagrange对偶的基本思想是 在目标函数中考虑问题的约束条件,即添加约束条件的加权和,得到增广的目标函数。

求解上述的支持向量机优化问题需要将其转换为 对偶问题。对式(6.6)使用拉格朗日乘子法可得到其“对偶问题”(dual problem),即对式(6.6)的每条约束添加拉格朗日乘子a>0,则该问题的拉格朗日函数可写为
在这里插入图片描述
其中α=(α12…;αm) 令 L(w,b,α) 对 w 和 b 的偏导为零可得
在这里插入图片描述
讲上式的 w 代入式子6.8,即可将 L(w,b,α) 中的 w 和 b 消去,再考虑上式的约束,就得到 式(6.6) 的对偶问题:
在这里插入图片描述
我们只需要解出 α 后,求出 w 与 b 即可得到模型
在这里插入图片描述

那么,具体如何求解式(6.11)呢 ?
常规方法:不难发现,这是一个二次规划问题,可使用通用的二次规划算法来求解。

问题:该问题的规模正比于训练样本数,这会在实际任务中造成很大的开销。
高效算法:以SMO (Sequential Minimal Optimization)为代表。

SMO的基本思路是先固定 αi 之外的所有参数,然后求 αi 上的极值。由于存在约束∑mi=1αiyi=0,若固定 αi 之外的其他变量, 则 αi 可由其他变量导出。于是, SMO每次选择两个变量 αi 和αj ,并固定其他参数。这样,在参数初始化后,SMO不断执行如下两个步骤直至收敛:
1、选取一对需更新的变量 αi 和 αj;
2、固定 αi 和 αj 以外的参数,求解式(6.11)获得更新后的 αi 和 αj

4、核函数

前面的讨论中,我们假设训练样本是线性可分的。而对于 “异或” 问题等非线性可分问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,例如在图6.3。如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。
在这里插入图片描述
令 Φ(x) 表示将 x 映射后的特征向量,于是,在特征空间中划分超平面所对应的模型可表示为在这里插入图片描述
其中w和b是模型参数.类似式(6.6),有
在这里插入图片描述
其对偶问题是
在这里插入图片描述
由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算Φ(xi)TΦ(xj)通常是困难的。所以设想这样一个函数:
在这里插入图片描述
即 xi 与 xj 在特征空间的内积等于它们在原始样本空间中通过函数 κ ( •,•) 计算的结果。有了这样的函数,我们就不必直接去计算高维甚至无穷维特征空间中的内积,于是式(6.21)可重写为
在这里插入图片描述
求解后即可得到
在这里插入图片描述
这里的函数 κ ( •,•) 就是“核函数”(kernel function)。

特征空间的好坏对支持向量机的性能至关重要。在不知道特征映射的形式时,我们并不知道什么样的核函数是合适的,而核函数也仅是隐式地定义了这个特征空间。于是,“核函数选择”成为支持向量机的最大变数,若核函数选择不合适,样本将映射到一个不合适的特征空间,很可能导致性能不佳。

表6.1列出了几种常用的核函数。
在这里插入图片描述
此外,核函数还可通过函数组合得到,例如:

  • 若 κ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)也是核函数。

问题:在现实任务中往往很难确定合适的核函数使得训练样本在特征空间中线性可分;即便恰好找到了某个核函数使其线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合所造成的。

5、软间隔

缓解该问题的一个办法是允许支持向量机在一些样本上出错,为此,要引入“软间隔”(soft margin)的概念,如图6.4所示。
在这里插入图片描述
具体来说,前面介绍的支持向量机形式是要求所有样本均满足约束(6.3),即所有样本都必须划分正确,这称为“硬间隔”(hard margin)而软间隔则是允许某些样本不满足约束yi(wT+b)>=1。

当然,在最大化间隔的同时,不满足约束的样本应尽可能少。于是,优化目标可写为
在这里插入图片描述
其中C>0是一个常数,l0/1是“0/1损失函数”
在这里插入图片描述
显然,当C为无穷大时,式(6.29)迫使所有样本均满足约束,于是式(6.29)等价于(6.6);当C取有限值时,式(6.29)允许一些样本不满足约束。

然而,0/1损失函数 非凸、非连续,数学性质不太好,使得式(6.29)不易直接求解。于是,人们通常用其他一些函数来代替 0/1损失函数 称为“替代损失”(surrogate loss)。图6.5给出了三种常用的替代损失函数:
在这里插入图片描述
在这里插入图片描述
引入“松弛变量”(slack variables) ξi >= 0,可将式(6.29)重写为
在这里插入图片描述
这就是常用的“软间隔支持向量机”
显然,式中每个样本都有一个对应的松弛变量,用以表征该样本不满足约束(6.28)的程度。

6、正则化

我们还可以把式(6.29)中的0/1损失函数换成别的替代损失函数以得到其他学习模型,这些模型的性质与所用的替代函数直接相关,但它们具有一个共性:优化目标中的第一项用来描述划分超平面的“间隔”大小,另一项 ∑mi=1L( f(xi), yi ) 用来表述训练集上的误差,可写为更一般的形式
在这里插入图片描述
Ω(f) 称为“结构风险”(structural risk),用于描述模型的某些性质。
mi=1L( f(xi), yi )称为“经验风险”(empirical risk),用于描述模型与训练数据的契合程度。
C用于对二者进行折中。

从经验风险最小化的角度来看:
Ω(f) 表述了我们希望获得具有何种性质的模型(例如希望获得复杂度较小的模型),这为引入领域知识和用户意图提供了途径;另一方面,该信息有助于削减假设空间,从而降低了最小化训练误差的过拟合风险。从这个角度来说,式(6.42)称为“正则化”(regularization)问题,Ω(f) 称为正则化项, C则称为正则化常数。

7、支持向量回归

现在我们来考虑回归问题,给定训练样本D,希望学得一个形如式(6.7)的回归模型,使得 f(x) 与g尽可能接近,w 和 b 是待确定的模型参数。
在这里插入图片描述
对样本 (x,y),传统回归模型通常直接基于模型输出 f(x) 与真实输出 y 之间的差别来计算损失,当且仅当 f(x) 与 y 完全相同时,损失才为零。

与此不同,支持向量回归 (Support Vector Regression,简称SVR) 假设我们能容忍 f(x) 与 y 之间最多有 ε 的偏差,即仅当 f(x) 与 y 之间的差别绝对值大于 ε 时才计算损失。如图6.6所示,这相当于以 f(x) 为中心,构建了一个宽度为 2ε 的间隔带,若训练样本落入此间隔带,则认为是被预测正确的。
在这里插入图片描述
SVR问题可形式化为
在这里插入图片描述
其中C为正则化常数,e是图6.7所示的 le 不敏感损失(e-insensitive loss)函数:
在这里插入图片描述
在这里插入图片描述

8、核方法

若不考虑偏移项b,则无论 SVM还是SVR,学得的模型总能表示成核函数 κ(x,xi)的线性组合。

人们发展出一系列基于核函数的学习方法,统称为“核方法”(kernelmethods)。 最常见的,是通过“核化”(即引入核函数)来将线性学习器拓展为非线性学习器。

猜你喜欢

转载自blog.csdn.net/chengdong996/article/details/107505833