支持向量机 (一): 线性可分类 svm
支持向量机(support vector machine, 以下简称 svm)是机器学习里的重要方法,特别适用于中小型样本、非线性、高维的分类和回归问题。本系列力图展现 svm 的核心思想和完整推导过程,以飨读者。
一、原理概述
机器学习的一大任务就是分类(Classification)。如下图所示,假设一个二分类问题,给定一个数据集,里面所有的数据都事先被标记为两类,能很容易找到一个超平面(hyperplane)将其完美分类。
然而实际上可以找到无数个超平面将这两类分开,那么哪一个超平面是效果最好的呢?
要回答这个问题,首先就要定义什么叫做“效果好”?在面临机器学习问题的时候普遍不是很关心训练数据的分类正确与否,而是关心一个新数据出现时其能否被模型正确分类。如果新数据被分类的准确率高,可以认为是“效果好”,或者说有较好的泛化能力。因此这里的问题就转化为:上图中哪一个超平面对新数据的分类准确率最高?
然而令人沮丧的是,没人能确切地回答哪个超平面最好,因为没人能把真实世界中的所有数据都拿过来测试。从广义上来说,大部分的理论研究都是对真实情况的模拟,譬如我们用人均收入来衡量一个国家的人民生活水平,这里的人均收入甚至只是一个不太接近的近似,因为不可能把每个国家中所有人的收入都拿出来一一比较。我们的大脑善于把繁琐的细节组合起来并高度抽象化,形成模型和假设,来逼近真实情况。
所以,在这个问题上我们能做的,也只有提出假设,建立模型,验证假设。而在 svm 中,这个假设就是:拥有最大“间隔”的超平面效果最好。
间隔(margin)指的是所有数据点中到这个超平面的最小距离。如下图所示,实线为超平面,虚线为间隔边界,黑色箭头为间隔,即虚线上的点到超平面的距离。可以看出,虚线上的三个点(2蓝1红)到超平面的距离都是一样的,实际上只有这三个点共同决定了超平面的位置,因而它们被称为“支持向量(support vectors)”,而“支持向量机”也由此而得名。
于是我们来到了svm的核心思想 —— 寻找一个超平面,使其到数据点的间隔最大。原因主要是这样的超平面分类结果较为稳健(robust),对于最难分的数据点(即离超平面最近的点)也能有足够大的确信度将它们分开,因而泛化到新数据点效果较好。
比如上左图的红线和紫线虽然能将两类数据完美分类,但注意到这两个超平面本身非常靠近数据点。以紫线为例,圆点为测试数据,其正确分类为蓝色,但因为超平面到数据点的间隔太近,以至于被错分成了黄色。 而上右图中因为间隔较大,圆点即使比所有蓝点更靠近超平面,最终也能被正确分类。
二、间隔最大化与优化问题(线性可分类svm)
给定一组数据 \(\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\}\), 其中 \(\boldsymbol{x}_i \in \mathbb{R}^d\), \(y_i \in \{-1, +1\}\) 。如果两类样本线性可分,即存在一个超平面 \(\boldsymbol{w}^{\top} \boldsymbol{x}+b = 0\) 将两类样本分隔开,这样可以得到:
\[
y_{i} \operatorname{sign}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)=1 \iff y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)>0 \tag{1.1}
\]
对于任意的 \(\zeta > 0\) ,\((1.1)\) 式等价于 \(y_{i}\left(\zeta\, \boldsymbol{w}^{\top} \boldsymbol{x}_{i}+\zeta\, b\right)>0\) ,则说明 \((\boldsymbol{w}, b)\) 具有放缩不变性,为了后面优化方便,令 \(\min |\boldsymbol{w^\top x} + b| = 1\) ,即:
\[
\begin{cases}
\boldsymbol{w}^{\top}\boldsymbol{x}_i + b \geqslant +1, \quad \text{if} \;\; {y}_i = +1 \\
\boldsymbol{w}^{\top}\boldsymbol{x}_i + b \leqslant -1, \quad \text{if} \;\;y_i = -1 \\
\end{cases}
\]
这样 \((1.1)\) 式就转化为
\[
y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right) \geq 1 \tag{1.2}
\]
上一节提到我们希望间隔最大化,那么间隔该如何表示? 样本空间任意点 \(\boldsymbol{x}\) 到超平面的距离为 \(dist = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||}\) (证明见附录),间隔为距离超平面 \(\boldsymbol{w}^{\top} \boldsymbol{x}+b = 0\) 最近的样本到超平面距离的两倍,即:
\[
\gamma = 2 \min \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||} = \frac{2}{||\boldsymbol{w}||}
\]
这样线性 svm 的优化目标即为:
\[
\begin{aligned}
{\max_{\boldsymbol{w}, b}} & \;\;\frac{2}{||\boldsymbol{w}||} \implies \min\limits_{\boldsymbol{w}, b}\frac12 ||\boldsymbol{w}||^2 \\[1ex]
{\text { s.t. }} & \;\;y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right) \geq 1 , \quad i=1,2, \ldots, m
\end{aligned} \tag{1.3}
\]
这是一个凸二次规划(convex quadratic programming)问题,可以用现成的软件包计算。该问题有 \(d + 1\) 个变量 (\(d\) 为 \(\boldsymbol{x}_i\) 的维度) 和 \(m\) 个约束,如果 \(d\) 很大,则求解困难。所以现实中一般采用对偶算法(dual algorithm),通过求解原始问题(primal problem)的对偶问题(dual problem),来获得原始问题的最优解。这样做的优点,一是对偶问题往往更容易求解,二是能自然地引入核函数,进而高效地解决高维非线性分类问题。
三、拉格朗日对偶性
原始的优化问题 \((1.3)\) 式与对偶问题的转换关系如下,里面的一些具体原理可参阅前文 (拉格朗日乘子法 - KKT条件 - 对偶问题) :
由拉格朗日乘子法,注意这里有 \(m\) 个样本,于是为每条约束引入拉格朗日乘子 \(\alpha_i \geqslant 0\) ,\((1.3)\) 式的拉格朗日函数为:
\[
\mathcal{L}(\boldsymbol{w}, b, \boldsymbol{\alpha}) =\frac{1}{2} ||\boldsymbol{w}||^2+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)\right) \tag{2.1}
\]
其相应的对偶问题为:
\[
\begin{align*}
\max _{\boldsymbol{\alpha}}\min _{\boldsymbol{w}, b} & \;\; \frac{1}{2} ||\boldsymbol{w}||^2+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(\boldsymbol{w}^{\top} \boldsymbol{x}_{i}+b\right)\right) \\
\text{s.t.} & \;\; \alpha_i \geqslant 0, \quad i=1,2, \ldots, m
\end{align*} \tag{2.2}
\]
上式内层对 \((\boldsymbol{w}, b)\) 的优化属于无约束优化问题,则令偏导等于零:
\[
\begin{align*}
\frac{\partial \mathcal{L}}{\partial \boldsymbol{w}}=\mathbf{0} & \implies \boldsymbol{w}=\sum_{i=1}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\
\frac{\partial \mathcal{L}}{\partial b}=0 & \implies \sum_{i=1}^{m} \alpha_{i} y_{i}=0 \\
\end{align*}
\]
代入 \((2.2)\) 式得:
\[
\begin{align*}
\max_{\boldsymbol{\alpha}} \quad& \sum\limits_{i=1}^m \alpha_i - \frac12 \sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i\alpha_j y_i y_j \boldsymbol{x}_i \boldsymbol{x}_j \\[1ex]
\text{s.t.} \quad & \alpha_i \geqslant 0, \quad i=1,2, \ldots, m \\[1ex]
& \sum\limits_{i=1}^m \alpha_i y_i = 0
\end{align*} \tag{2.3}
\]
此依然属于二次规划问题,求出 \(\boldsymbol{\alpha}\) 后,即可得原始问题的参数 \((\boldsymbol{w}, b)\) 。该二次规划问题有 \(m\) 个变量, \((m + 1)\)项约束,因而适用于 \(d\) 很大,\(m\) 适中 ( \(d >> m\) ) 的情况。而当 \(m\) 很大时,问题变得不可解,这时候可使用 SMO 这类专为 svm 设计的优化算法,后文详述。 另外上文也提到 \((1.3)\) 式的原始二次规划问题适用于 \(d\) 比较小的低维数据,所以 scikit-learn 中的 LinearSVC 有 dual : bool, (default=True) 这个选项,当样本数 > 特征数时,宜设为 False,选择解原始优化问题,可见使用 svm 并不是非要转化为对偶问题不可 。而相比之下 SVC 则没有 dual 这个选项,因为 SVC 中实现了核函数,必须先转化为对偶问题,后文再议。
前文已证明 \((2.2)\) 式的最优解应满足 KKT 条件,由 KKT 条件中的互补松弛条件可知 \(\alpha_i (1 - y_i (\boldsymbol{w}^\top \boldsymbol{x}_i + b)) = 0\) 。当 \(\alpha_i > 0\) 时, \(y_i(\boldsymbol{w}^\top\boldsymbol{x}_i + b) = 1\) ,说明这些样本点 \((\boldsymbol{x}_i, y_i)\) 一定在间隔边界上,它们被称为“支持向量”,这些点共同决定了分离超平面。这是 svm 的一个重要特性: 训练完成后,大部分训练样本不需要保留,最终模型仅与支持向量有关。
于是可根据支持向量求 \(\boldsymbol{w}\):
\[
\begin{align*}
\boldsymbol{w} &=\sum_{i=1}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\
&=\sum_{i:\,\alpha_i=0}^{m} 0 \cdot y_{i} \boldsymbol{x}_{i}+\sum_{i : \,\alpha_{i}>0}^{m} \alpha_{i} y_{i} \boldsymbol{x}_{i} \\
&=\sum_{i \in S V} \alpha_{i} y_{i} \boldsymbol{x}_{i}
\end{align*} \tag{2.5}
\]
其中 \(SV\) 代表所有支持向量的集合。对于任意支持向量 \((\boldsymbol{x}_s, y_s)\),都有 \(y_s(\boldsymbol{w}^\top \boldsymbol{x}_s + b) = 1\) 。将 \((2.5)\) 式代入,并利用 \(y_s^2 = 1\) :
\[
y_s(\sum\limits_{i \in {SV}} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s + b) = y_s^2 \quad \implies b = y_s - \sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s
\]
实践中,为了得到对 \(b\) 更稳健的估计,通常对所有支持向量求解得到 \(b\) 的平均值:
\[
b = \frac{1}{|SV|} \sum\limits_{s \in SV} \left( y_s - \sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top\boldsymbol{x}_s \right)
\]
于是线性 svm 的假设函数可表示为:
\[
f(\boldsymbol{x}) = \text{sign} \left(\sum\limits_{i \in SV} \alpha_i y_i \boldsymbol{x}_i^\top \boldsymbol{x} + b \right)
\]
附录: 点到超平面的距离
如上图所示,想要求 \(\boldsymbol{x}\) 到超平面 \(\boldsymbol{w}^\top\boldsymbol{x} + b = 0\) 的距离 \(d\) 。设 \(\boldsymbol{x}_0\) 和 \(\boldsymbol{x}_1\) 是超平面上的两个点,则:
\[
\begin{cases}
\boldsymbol{w}^{\top}\boldsymbol{x}_0 + b = 0 \\[0.5ex]
\boldsymbol{w}^{\top}\boldsymbol{x}_1 + b = 0
\end{cases}
\quad \implies \quad \boldsymbol{w}^\top (\boldsymbol{x}_0 - \boldsymbol{x}_1) = 0
\]
即 \(\boldsymbol{w}\) 垂直于超平面。
证明1:
\[
d = ||\boldsymbol{x} - \boldsymbol{x}_1|| \cos \theta = ||\boldsymbol{x} - \boldsymbol{x}_1|| \frac{|\boldsymbol{w}^\top(\boldsymbol{x} - \boldsymbol{x}_1)|}{||\boldsymbol{w}||\cdot||\boldsymbol{x} - \boldsymbol{x}_1||} = \frac{|\boldsymbol{w}^\top\boldsymbol{x} - \boldsymbol{w}^\top \boldsymbol{x}_1|}{||\boldsymbol{w}||} = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||}
\]
证明2: 由于 \(\frac{\boldsymbol{w}}{||\boldsymbol{w}||}\) 为单位向量:
\[
\boldsymbol{w}^\top\boldsymbol{x}_0 + b = \boldsymbol{w}^\top \left(\boldsymbol{x} - d\cdot \frac{\boldsymbol{w}} {||\boldsymbol{w}||} \right) + b = 0 \quad \implies \quad d = \frac{|\boldsymbol{w}^\top\boldsymbol{x} + b|}{||\boldsymbol{w}||}
\]
/
支持向量机 (一): 线性可分类 svm的更多相关文章
- 支持向量机 (二): 软间隔 svm 与 核函数
软间隔最大化(线性不可分类svm) 上一篇求解出来的间隔被称为 "硬间隔(hard margin)",其可以将所有样本点划分正确且都在间隔边界之外,即所有样本点都满足 \(y_{i ...
- 机器学习读书笔记(七)支持向量机之线性SVM
一.SVM SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法. 1 示例: 先用一个例子,来了解一下SVM 桌子上放了两种颜色的 ...
- 线性可分支持向量机与软间隔最大化--SVM(2)
线性可分支持向量机与软间隔最大化--SVM 给定线性可分的数据集 假设输入空间(特征向量)为,输出空间为. 输入 表示实例的特征向量,对应于输入空间的点: 输出 表示示例的类别. 我们说可以通过间隔最 ...
- 支持向量机通俗导论(理解SVM的三层境地)
支持向量机通俗导论(理解SVM的三层境地) 作者:July :致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector ...
- 【机器学习实战】第6章 支持向量机(Support Vector Machine / SVM)
第6章 支持向量机 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/lates ...
- 支持向量机通俗导论(理解SVM的三层境界)(ZT)
支持向量机通俗导论(理解SVM的三层境界) 原文:http://blog.csdn.net/v_JULY_v/article/details/7624837 作者:July .致谢:pluskid.白 ...
- 支持向量机通俗导论(理解SVM的三层境界)【非原创】
支持向量机通俗导论(理解SVM的三层境界) 作者:July :致谢:pluskid.白石.JerryLead. 出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vecto ...
- 支持向量机通俗导论(理解SVM的三层境界) by v_JULY_v
支持向量机通俗导论(理解SVM的三层境界) 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去 ...
- 支持向量机通俗导论(理解SVM的三层境界)
原文链接:http://blog.csdn.net/v_july_v/article/details/7624837 作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算 ...
随机推荐
- C-哈夫曼编码
/*author:windy_2*/ /*修正版*/ #include<stdio.h> #include<stdlib.h> #include<string.h> ...
- 2019牛客多校第一场 E-ABBA(dp)
ABBA 题目传送门 解题思路 用dp[i][j]来表示前i+j个字符中,有i个A和j个B的合法情况个数.我们可以让前n个A作为AB的A,因为如果我们用后面的A作为AB的A,我们一定也可以让前面的A对 ...
- Flutter学习笔记(12)--列表组件
如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...
- Lombok 使用介绍(常见注解)
目录 @Data @NonNull @Getter & @Setter @ToString @EqualsAndHashCode @NoArgsConstructor, @RequiredAr ...
- Django安装 测试、导入项目以及运行开发服务器
安装Django 下载Django包,解压缩. CMD 进入解压路径下. 执行:python setup.py install 增加环境变量: C:\Python27\Scripts 测试djang ...
- RocketMQ中Producer消息的发送
上篇博客介绍过Producer的启动,这里涉及到相关内容就不再累赘了 [RocketMQ中Producer的启动源码分析] Producer发送消息,首先需要生成Message实例: public c ...
- Jquery事件和选择器 纠错
1: 试题分析:该题考的是jQuery中事件绑定的知识.绑定事件用bind()方法,选项A是正确的绑定事件语法,因此是正确的答案.选项BCD的语法是错误的. 2: 试题分析:opacity 必需.规定 ...
- Java编程基础阶段笔记 day 07 面向对象编程(上)
面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性:成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个 ...
- sed流编辑器
一.前言 (一).sed 工作流程 sed 是一种在线的.非交互式的流编辑器,它一次处理一行内容.处理时,把当做前处理的行存储在临时缓存区中,成为“模式空间”(pattern space),接着用se ...
- Java - 自动配置log4j的日志文件路径
目录 1 日志路径带来的痛点 2 log4j.properties文件的配置 3 彻底解决痛点 3.1 单独的Java程序包 (非Java Web项目) 3.2 Web项目 4 附录 - 获取当前项目 ...