线性SVM的推导
线性SVM算法的一般过程
线性SVM的推导
超平面方程
SVM是用来分类的。给定一系列输入数据(n维向量),需要找到一个切分界线(n-1维的超平面),这里假定数据是线性可分的。比如,二维数据的超平面是直线,三维数据的超平面是二维平面。以二维数据为例:
二维平面的直线一般式:\(Ax+By+C=0\),可以写成向量的形式:
\[
\pmatrix {A \ B}\pmatrix {x\\y}+C=0
\]
令\(\vec w=\pmatrix {A\\B}\),\(\vec x=\pmatrix{x\\y}\),\(b=C\),则有:
\[
\vec w^T \vec x + b = 0
\]
这里的向量都是列向量。懂线性代数学的请无视~
将上述公式中向量的维度推广到n维,就得到n维数据的超平面。直观理解就是两个类别的分界。
functional margin
functional margin直译是:函数间距。听起来抽象~
在前面定义的超平面公式基础上,设\(f(\vec x)=\vec w^T \vec x + b\),则:
\[
f(\vec x)表示\begin{cases}
超平面左侧的数据点, &f(\vec x)>0\cr 超平面上的数据点, &f(\vec x)=0 \cr 超平面右侧的数据点, &f(\vec x)<0\end{cases}
\]
超平面上的点显然是几乎没有的,暂不考虑,剩余的就是两个类别各自的数据点了,分居在超平面两侧。按惯例用\(y_i\)表示第\(i\)个类别,这里取:
\[
y=sign(f(\vec x))=\begin{cases}1, \ \ \ \ \ f(\vec x)<0 \cr -1, \ f(\vec x)>0 \end{cases}
\]
这里用1和-1而不是0和-1,是为了后续推导方便。\(sign(x)\)是取符号函数。
好了,终于可以定义functional margin了:
\[
\hat \gamma = y(\vec w^T\vec x + b) = yf(\vec x) = sign(f(\vec x))f(\vec x)=|f(\vec x)|
\]
用\(f(\vec x)\)和它的符号相乘,得到的结果始终是正的:\(\forall \vec x, \hat \gamma > 0\)。
geometrical margin
geometrical margin直译为几何距离,也就是点到超平面的距离,也就是点到直线距离再乘以1或者-1。1和-1分别对应两个分类,也就是分类标签\(y\)的取值。前面对于\(y\)值的设定就是为此处考虑的。
如图,\(\vec x_0\)是超平面上一点,\(\vec x\)是任意一个点。这两个点都是n维向量,先试着计算它们的距离\(\gamma\):
\[
\gamma=d(\vec x, \vec x_0)=||\vec x - \vec x_0|| \\
=\frac{\vec x - \vec x_0}{\vec e} \\
=\frac{\vec x - \vec x_0}{\frac{\vec w}{||\vec w||}} \\
=>...
\]
这里的问题在于,使用了向量除法,其中\(\vec e\)表示和\(\vec x - \vec x_0\)同方向的单位向量,虽然类似定比分点的公式,但是还是不严格。好在只要稍微转换下书写形式,把除法写成乘法,就OK了:
\[
\vec x-\vec x_0 = \gamma \vec e =\gamma \frac{\vec w}{||\vec w||} \\左乘\vec w^T:
\vec w^T(\vec x-\vec x_0)=\gamma \frac{\vec w^T \vec w}{||\vec w||} \\
考虑f(\vec x_0)=0,f(\vec x)=\vec w^T\vec x,且\frac{\vec w^T \vec w}{||\vec w||}=||\vec w|| \\因此有:
\gamma=\frac{f(\vec x)}{||\vec w||}
\]
需要指出的是:这里的\(\vec x\)不一定处在\(\vec w\)所指向的一侧,它也许在相反一侧,因而\(\gamma\)可正可负,所以需要定义一个始终是正值的几何距离,即:根据functional margin来定义geometrical margin:
\[
\hat \gamma=yf(\vec x) \\
\gamma=\frac{f(\vec x)}{||\vec w||} \\
=>\tilde \gamma=y\gamma = \frac{\hat \gamma}{||\vec w||}
\]
注意!这里出现了新变量\(\tilde \gamma\),是geometrical margin
;\(\hat \gamma\)则表示functional margin
;\(\gamma\)则表示向量\(\vec x\)和\(\vec x_0\)之间的距离。显然,\(\tilde \gamma\)和\(\hat \gamma\)只相差一个缩放因子\(||\vec w||\),而且他们都是大于0的值。
最大化几何距离\(\tilde \gamma\)
前面引入了超平面、几何距离等概念。显然超平面上的点其所属类别是模糊的,而当超平面上的点离开超平面,离开的越远,其所属分类就越明晰,也有人称为:当点到超平面的margin越大,分类的confidence越大。总之,要让分类效果明显,就应当设法最大化margin。成千上万的数据点,都去计算margin肯定不行,而且显然只需要考虑距离超平面最近的那些点:这些点就是支持向量,支持向量到超平面的margin是所有点中最小的那一撮,设法最大化它们的margin就能完成最终的分类任务了。
那么,该最大化哪个margin呢?\(\tilde \gamma\)还是\(\hat \gamma\)呢?\(\tilde \gamma\)表示的是几何距离,直觉上应该选择它。试着考虑其具体表达式:
\[
\hat \gamma=|\vec w^T\vec x+b| \\
\tilde \gamma=\frac{|\vec w^T\vec x+b|}{||\vec w||} \\
=|\frac{\vec w^T}{||\vec w||}\vec x+\frac{b}{||\vec w||}|
\]
对于一个确定的超平面,\(\vec w\)和\(b\)的取值并不唯一,\(||\vec w||\)可大可小,通过缩放\(\vec w\)和\(b\)能保持超平面不变。但\(\frac{\vec w}{||\vec w||}\)和\(\frac{b}{\vec w}\)是唯一的,因而考虑最大化\(\tilde \gamma\)。实际上,不妨取\(||\vec w||=1\),那么等比例缩放\(b\),就能保持等式成立,而且此时\(\hat \gamma\)和\(\tilde \gamma\)取值相等。
此时,我们对于训练数据集\(S=\{x^{(i)}, y^{(i)};i=1,...,m\}\),我们重新定义参数\((\vec w,b)\)下的geometrical margin
为:
\[\gamma=\min_{i=1,...,m} \gamma^{(i)}\]
直观理解为:将超平面向1和-1两个类的方向分别移动,最先触碰到的那些点到分界超平面的距离为几何距离\(\gamma\)。而这些最先被触碰到的点,称为支持向量(support vector)。当然,先前处于分界超平面上的点不算。
进一步确定极值条件
当前的目标是:
\[
\max (\min d(\vec x, \vec x_0))
\],也就是:
\[
\max_{\gamma,\vec w,b} \frac {\hat \gamma}{||\vec w||} \\
s.t. \ \ \ \ y_i(\vec w^T \vec x_i+b) \ge \gamma, \ \ i=1,...,m
\]
这里从凸优化的方法,否定了取\(||\vec w||=1\)的做法,采取了让\(\hat \gamma=1\)的做法:支持向量到分解超平面的几何距离为1。而最小化"支持向量到分界超平面的几何距离",等价于“最小化支持向量之间在垂直于分界超平面的方向上的距离”,也就是:
\[
\max Margin = 2/||\vec w|| \ \ \ \ (cond1)
\]
同时,现在的情况是:不算分界超平面上的点,所有点满足:
\(\vec w^T \vec x_i+b \ge 1\),对于所有\(y_i=1\)
\(\vec w^T \vec x_i+b \le -1\),对于所有\(y_i=-1\)
也就是:
\[
y_i(\vec w^T \vec x_i + b)-1 \ge 0 \ \ \ \ (cond2)
\]
要满足cond1
和cond2
,就能得到最终解。而cond1
等价于:计算\(\min ||\vec w||^2/2\)。
对于不等式约束的条件极值问题,可以用拉格朗日方法求解。而拉格朗日方程的构造规则是:用约束方程乘以非负的拉格朗日系数,然后再从目标函数中减去。于是得到拉格朗日方程如下:
\[
L(\vec w,b,\alpha_i)=\frac{1}{2}||\vec w||^2-\sum_{i=1}^{l}\alpha_i(y_i(\vec w^T \vec x_i+b)-1)=\frac{1}{2}||\vec w||^2-\sum_{i=1}^{l}\alpha_i y_i(\vec w^T \vec x_i+b)+\sum_{i=1}^{l}\alpha_i
\]
其中:
\[
\alpha_i \ge 0 \ \ \ \ (4)
\]
那么我们要处理的规划问题就变为:
\[
\min_{\vec w,b} \max_{\alpha_i \ge 0} L(\vec w,b,\alpha_i) \ \ \ \ (5)
\]
上市才是严格的不等式约束的拉格朗日条件极值的表达式。对于这一步的变换,很多文章都没有多做表述,或者理解有偏差,从而影响了读者后续的推演。在此我将详细地一步步推导,以解困惑。
(5)式是一个凸规划问题,其意义是先对\(\alpha\)求偏导,令其等于0消掉α,然后再对w和b求L的最小值。要直接求解(5)式是有难度的,通过消去拉格朗日系数来化简方程,对我们的问题无济于事。所幸这个问题可以通过拉格朗日对偶问题来解决,为此我们把(5)式做一个等价变换:
\[
\min_{\vec w, b} \max_{\alpha_i \ge 0} L(\vec w,b,\alpha_i)= \max_{\alpha_i \ge 0}L(\vec w,b,\alpha_i)
\]
上式即为对偶变换,这样就把这个凸规划问题转换成了对偶问题:
\[
\max_{\alpha_i \ge 0} \min_{\vec w,b}L(\vec w, b, \alpha_i) \ \ \ \ (6)
\]
其意义是:原凸规划问题可以转化为先对w和b求偏导,令其等于0消掉w和b,然后再对α求L的最大值。下面我们就来求解(6)式,为此我们先计算w和b的偏导数。由(3)式有:
\[
\frac{\partial L(\vec w,b,\alpha_i)}{\partial \vec w}=\vec w-\sum_{i=1}^{l}\alpha_i y_i x_i \\
\frac{\partial L(\vec w,b,\alpha_i)}{\partial b}=-\sum_{i=1}^{l}\alpha_i y_i \ \ \ \ (7)
\]
为了让L在w和b上取到最小值,令(7)式的两个偏导数分别为0,于是得到:
\[
\vec w=\sim_{i=1}^{l}\alpha_i y_i x_i \\
\sum_{i=1}^{l}\alpha_i y_i=0 \ \ \ \ (8)
\]
将(8)代回(3)式,可得:
再把(9)代入(6)式有:
\[
\max_{\alpha_i \ge 0} \min_{\vec w,b}L(\vec w,b,\alpha_i)=\max_{\alpha_i \ge 0}=\max_{\alpha_i \ge 0}{\sum_{i=1}^{l}\alpha_i-\frac{1}{2}\sum_{i=1}^{l}\sum_{j=1}^{l}\alpha_i \alpha_j y_i y_j(x_i·x_j)} \ \ \ \ (10)
\]
考虑到(8)式,我们的对偶问题就变为:
\[
\max_{\alpha_i}{\sum_{i=1}^{l}\alpha_i}-\frac{1}{2}\sum_{i=1}^{l}\sum_{j=1}^{l}\alpha_i \alpha_j y_i y_j(x_i · x_j) \\
s.t. \ \ \sum_{\alpha_i}^{y_i}=0 \\
\alpha_i \ge 0
\]
上式这个规划问题可以直接从数值方法计算求解。
需要指出的一点是,(2)式的条件极值问题能够转化为(5)式的凸规划问题,其中隐含着一个约束,即
\[
\alpha_i(y_i(\vec w · x_i + b)-1)=0 \ \ \ \ (12)
\]
这个约束是这样得来的,如果(2)和(5)等效,必有:
\[
\max_{\alpha_i \ge 0}L(\vec w, b, \alpha_i) = \frac{1}{2}||\vec w||^2
\]
把(3)式代入上式中,得到:
化简得到:
\[
\min_{\alpha_i \ge 0}{\sum_{i=1}^{l}\alpha_i (y_i(\vec w · x_i + b)-1)}=0 \ \ \ \ (13)
\]
又因为约束(1)式和(4)式,有:
所以要使(13)式成立,只有令:\(\alpha_i(y_i(\vec w·x_i + b)-1) = 0\),由此得到(12)式的约束。该约束的意义是:如果一个样本是支持向量,则其对应的拉格朗日系数非零;如果一个样本不是支持向量,则其对应的拉格朗日系数一定为0。由此可知大多数拉格朗日系数都是0。
一旦我们从(11)式求解出所有拉格朗日系数,就可以通过(8)式的
\[
\vec w=\sum_{i=1}^{l}\alpha_i y_i x_i
\]
计算得到最优分割面H的法向量w。而分割阈值b也可以通过(12)式的约束用支持向量计算出来。这样我们就找到了最优的H1和H2,这就是我们训练出来的SVM。
参考
[支持向量机: Maximum Margin Classifier](Maximum Margin Classifier](http://blog.pluskid.org/?p=632)
支持向量机(SVM)的详细推导过程及注解(一)
线性SVM的推导的更多相关文章
- 线性SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...
- 《机器学习技法》---线性SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...
- SVM1 线性SVM
一.Linear Support Vector Machine 接下来的讨论假设数据都是线性可分的. 1.1 SVM的引入:增大对测量误差的容忍度 假设有训练数据和分类曲线如下图所示: 很明显,三个分 ...
- 机器学习读书笔记(七)支持向量机之线性SVM
一.SVM SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法. 1 示例: 先用一个例子,来了解一下SVM 桌子上放了两种颜色的 ...
- 线性SVM分类器实战
1 概述 基础的理论知识参考线性SVM与Softmax分类器. 代码实现环境:python3 2 数据处理 2.1 加载数据集 将原始数据集放入"data/cifar10/"文件夹 ...
- 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
<Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...
- [ML从入门到入门] 支持向量机:从SVM的推导过程到SMO的收敛性讨论
前言 支持向量机(Support Vector Machine,SVM)在70年代由苏联人 Vladimir Vapnik 提出,主要用于处理二分类问题,也就是研究如何区分两类事物. 本文主要介绍支持 ...
- cs231n --- 1:线性svm与softmax
cs231n:线性svm与softmax 参数信息: 权重 W:(D,C) 训练集 X:(N,D),标签 y:(N,1) 偏置量bias b:(C,1) N:训练样本数: D:样本Xi 的特征维度, ...
- 支持向量机(Support Vector Machine,SVM)—— 线性SVM
支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术.尽管现在 Deep Learnin ...
随机推荐
- Hbase(补充)
1.用sqoop 从mysql数据库导入数据到hbase时: 可以用 sqoop list-databases --connect jdbc:mysql://192.168.1.152:3306 ...
- 解题:ZJOI 2014 力
题面 事实说明只会FFT板子是没有用的,还要把式子推成能用FFT/转化一下卷积的方式 虽然这个题不算难的多项式卷积 稍微化简一下可以发现实际是$q_i$和$\frac{1}{(i-j)^2}$在卷,然 ...
- Oracle中rank() over, dense_rank(), row_number() 的区别
摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm Oracle 中 rank() over, dense_rank(), row_number() ...
- C# 利用mysql.data 在mysql中创建数据库及数据表
C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ...
- 把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取
链接: http://blog.csdn.net/dreamgchuan/article/details/51113295 dir /on/b/s 这个读取的是这样的格式:
- C++并发编程 互斥和同步
C++并发编程 异步任务(async) 线程基本的互斥和同步工具类, 主要包括: std::mutex 类 std::recursive_mutex 类 std::timed_mutex 类 std: ...
- 微信小程序踩过的坑
之前用小程序开发工具做过一个项目了,最近又新开了一个项目,在登录的时候发现总是提示code不合法,找了半天也未发现原因 后来同事提醒是不是因为开发工具里设置的AppId的问题,果断将当前工具里默认Ap ...
- [应用篇]第四篇 JSTL之C标签介绍
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- 图论&数学:最小平均值环
POJ2989:求解最小平均值环 最优化平均值的显然做法是01分数规划 给定一个带权有向图 对于这个图中的每一个环 定义这个环的价值为权值之和的平均值 对于所有的环,求出最小的平均值 这个结论怎么做的 ...
- Python学习笔记(三十一)正则表达式
---恢复内容开始--- 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 ...