SVM学习笔记(一)
来源:互联网 发布:新奔腾造价软件 编辑:程序博客网 时间:2024/05/29 18:20
支持向量机即Support Vector Machine,简称SVM。一听这个名字,就有眩晕的感觉。支持(Support)、向量(Vector)、机器(Machine),这三个毫无关联的词,硬生生地凑在了一起。从修辞的角度,这个合成词最终落脚到”Machine”上,还以为是一种牛X的机器呢?实际上,它是一种算法,是效果最好的分类算法之一。
SVM是最大间隔分类器,它能很好地处理线性可分的问题,并可推广到非线性问题。实际使用的时候,还需要考虑噪音的问题。
本文只是一篇学习笔记,主要参考了July、pluskid等人相关文章。将要点记录下来,促进自己的进步。
SVM是最大间隔分类器
既然SVM是用来分类的,咱就举个简单的例子,看看这个SVM有啥特点。如下图所示,有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,可以用一条直线将这两个数据分开,这样的直线可以有无数条。
绿线、粉红线、黑线都能将两类区分开。但是那种更好呢?感觉上黑线似乎更好些。粉红线和绿线都离样本太近。要是样本或分界线稍稍有些扰动,分类就可能出错。黑线好就好在离两类都有一个安全间隔(蓝线与黑线间的间隔),即使有些扰动,分类还是准确的。这个安全间隔,也就是“Margin”,当然我们觉得间隔越大分类越准确。
这种分类思想该作何理解呢,他和逻辑回归的分类有何区别呢?
当用逻辑回归的思想来处理分类问题时(将数据分成正负两类:正类y=1,负类y=0)。逻辑回归函数反映的是数据是正类的概率,当这个概率大于0.5时,预测这个数据是正类,反之,小于0.5时,预测这个数据是负类。它优化的目标是预测出错的概率越小越好。可以参看这里
SVM则不同,它要找出一条离两类都有一定安全间隔的分界线(专业点叫超平面)。优化的目标就是安全间隔越大越好。
因此,SVM也被叫做最大间隔分类器。
线性可分的情况
SVM是通过间隔来分类。我们怎么来定量地表达呢?先来看看线性可分的情况,分类函数
先来看看函数间隔,用
那这个是不是就完美表达了我们想要的间隔呢?看看这种情况,固定超平面,当
这个
,当然它得满足一些条件,根据margin的含义
其中
支持向量作何理解
说了这么多,也没有说到Support vector(支持向量),仔细观看下图:
有两个支撑着中间的分界超平面的超平面,称为gap。它们到分界超平面的距离相等。这两个gap上必定会有一些数据点。如果没有,我们就可以进一步扩大margin了,那就不是最大的margin了。这些经过gap的数据点,就是支持向量(Support Vector)(它们支持了中间的超平面)。很显然,只有支持向量才决定超平面,其他的数据点不影响超平面的确定。
这是一个十分优良的特性。假设有100万个数据点,支持向量100个,我们实际上只需要用这100个支持向量进行计算!!!这将大大提高存储和计算的性能。
线性SVM的求解
考虑目标函数:
由于求的
1/2是方便求导时约去。这时目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题可以用现成的QP(Quadratic Programming)的优化包进行求解。但是这个问题还有些特殊的结构,可以通过Lagrange Duality变换到对偶变量的优化问题。通常求解对偶变量优化问题的方法比QP优化包高效得多,而且推导过程中,可以很方便地引出核函数。
简单地说,通过给每个约束条件加上一个拉格朗日乘子,我们可以将它们融和到目标函数里去,拉格朗日函数如下:
这里还需要说明一点。当
这里省略掉推导的过程,这个函数经过变换,并且满足KKT条件。会得出如下结论:
求解的问题可以变换为
上式可以通过SMO算法求出拉格朗日乘子
,求出b
处理非线性问题
通过上面的讨论,我们表达了SVM的目标函数,并给出了求解的方法。于是SVM就讲完了,可以休息了?细心的读者一定发现,上面是在线性可分的前提下展开讨论的。线性不可分的时候怎么办?
那可不可以将非线性问题转换成线性问题呢?先来看个例子。
二维平面上,这是一个典型的线性不可分的问题。但我们增加一些特征,将数据点映射到高维空间,他就变成了线性可分的点集了。如下图:
事实上,将任何线性不可分的点集映射到高维空间(甚至可以到无穷维空间),总能变成线性可分的情况。只不过维数越高,计算量越大。维数大到无穷的时候,就是一场灾难了。
现在我们还是从数学上梳理一下这个映射的过程。
根据
经过映射,分类函数变成
而
这样,似乎是拿到非线性数据,就找一个适当的映射
观察上式,映射只是一个中间过程,我们实际需要的是计算内积。如果有一种方式可以在特征空间中直接计算内积。就能很好地避免维数灾难了,这样直接计算的方法称为核函数方法。
核是一个函数
几个常用的核函数
通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:
- 高斯核\kappa(x_1,x_2) = \exp\left(-\frac{|x_1-x_2|^2}{2\sigma^2}\right)
κ(x1,x2)=exp(−|x1−x2|22σ2) ,这个空间会将原始空间映射到无穷维空间。不过,如果\sigmaσ 选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的空间;反过来,如果\sigmaσ 选得很小的话,则可以将任意的数据映射为线性可分。当然,这不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维空间不可分数据通过高斯核函数映射到了高维空间:
- 多项式核\kappa(x_1,x_2)=(\langle x_1,x_2\rangle+R)^d,这个核所对应的映射实际上是可以写出来的,该空间的维度是
κ(x1,x2)=(⟨x1,x2⟩+R)d
\binom{m+d}{d}(m+dd) ,其中mm 是原始空间的维度。 - 线性核\kappa(x_1,x_2) = \langle x_1,x_2\rangle
κ(x1,x2)=⟨x1,x2⟩ ,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。
核函数的本质
总结一下核函数,实际是三点:
- 实际中,当我们遇到线性不可分的样例,常用做法是把样例特征映射到高维空间中
- 但如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的
- 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
处理噪音
回顾此前的介绍,SVM用来处理线性可分的问题。后来为了处理非线性数据,使用核函数将原始数据映射到高维空间,转化为线性可分的问题。但是有时候,并不是数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离正常位置很远的数据点,我们称之为outlier。超平面本身就是只有少数几个支持向量组成,如果支持向量里存在outlier,就会有严重影响。如下图:
用黑圈圈起来的那个蓝点就是一个outlier,它偏离了自己原本所应该的那个半空间,如果直接忽略掉,原本的分隔超平面还是挺好的,但是由于这个outlier的出现,导致分隔超平面不得不被挤歪了,变成黑色虚线所示,同时margin也相应变小了。更严重的是,如果outlier再往右上移动一些距离的话,将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM允许数据点在一定程度上偏离一下超平面。上图中,黑色实线所对应的距离,就是该outlier偏离的距离,如果把它移动回来,就刚好落在原来的超平面上,而不会使超平面发生变形了。具体来说,原来的约束条件变成:
其中
,其中C是一个参数,用于控制目标函数中两项(寻找margin最大的超平面和保证数据点偏差最小)之间的权重。注意,
通过拉格朗日对偶求解,
求解的问题可以变换为
对比之前的结果,只不过是
总结
- SVM是一个最大间距分类器。
- 在线性可分的情况下,它的目标函数是
min12|w|2s.t.,yi(wTxi+b)≥1,i=1,…,n ,较好的求解方法是转换为拉格朗日对偶问题,并用SMO算法进行求解。 - 在线性不可分的情况下,其基本思想是,将低维线性不可分的问题映射为高维可分的问题。具体实现办法是:利用核函数,在低维空间进行运算,而将实质上的分类效果表现在高维上。
- 考虑到数据点中可能存在噪音的干扰,需要将目标函数中加入松弛变量而求解的思路和方法不变。
- SVM学习笔记(一)
- SVM 学习笔记(一)
- SVM学习(一):SVM概念
- SVM学习(一):SVM概念
- SVM学习(一):SVM概念
- 机器学习笔记08:支持向量机(一)(SVM)
- SVM笔记(一) 概况
- 机器学习(一):SVM
- SVM学习笔记(二)
- SVM学习笔记(四)
- SVM学习笔记(四)
- SVM学习笔记(day1)
- 【机器学习】SVM学习(一):SVM概念
- SVM学习总结(一)如何学习SVM
- 机器学习-支持向量机SVM学习笔记一
- SVM算法笔记一
- SVM算法笔记一
- opencv svm 笔记一
- (八)Intellij mybatis 插件mybatis-generator 使用
- 配置NFS
- Communications link failure
- nginx 操作
- 内核模块加载
- SVM学习笔记(一)
- android下使用x264编码yuv为h264数据的例子
- 在OS X 10.11上安装cocoapods时出现错误
- 衣服颜色暴露女人性格,气质.....你是哪一种?
- leetcode之Ugly Number II
- Maven常用的命令
- TCP(传输控制协议)
- 并查集 — — 关押罪犯
- Android应用内存优化-图片如何优化