支持向量机即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是通过间隔来分类。我们怎么来定量地表达呢?先来看看线性可分的情况,分类函数$$f(x)=w^Tx+b$$
$x$是特征向量,$w$是与特征向量维数相同的向量,也叫权重向量,$b$是一个实数,也叫偏置。当$f(x) = 0$时,表达的就是SVM的分类边界,也就是超平面。SVM分成的类y可以为1或-1(注意,与逻辑回归不同,不是1和0)。$f(x)$大于0的点对应y=1的数据,$f(x)$小于0的点对应y=-1的数据。那我们关心的间隔怎么表达?
先来看看函数间隔,用$\hat{\gamma}$表示:$\hat{\gamma}=y(w^Tx+b)=yf(x)$。$|f(x)|$值越大,也就是$yf(x)$越大,数据点离超平面越远,我们越能确信这个数据属于哪一类别,这是最直观的认识。
那这个是不是就完美表达了我们想要的间隔呢?看看这种情况,固定超平面,当$w$,$b$同时乘以2,这个间隔就扩大了两倍。那怎么表达不受参数缩放的变化影响的间距呢?老老实实来画个图看看咯。

$x$是超平面外的一点,它离超平面的距离是$\gamma$,显然$w$是超平面的法向量,$x_0$是$x$在超平面的投影。则$
x=x_0+\gamma\frac{w}{||w||}$,其中$||w||$是范数,用初等数学来理解就是向量的长度,也叫向量的模。因为在超平面上,$f(x_0)=0$,等式两边乘以$w^T$,再加上一个$b$,化简可得$\gamma = \frac{w^Tx+b}{||w||}=\frac{f(x)}{||w||}$。注意这个$\gamma$是可正可负的,为了得到绝对值,乘以一个对应的类别y,即可得出几何间隔(用$\tilde{\gamma}$表示)的定义:
$$\tilde{\gamma}= \frac{yf(x)}{|w|} = \frac{\hat{\gamma}}{|w|}$$
这个$\tilde{\gamma}$是不受参数缩放影响的。于是,我们的SVM的目标函数就是$$\max \tilde{\gamma}$$
,当然它得满足一些条件,根据margin的含义$$
y_i(w^Tx_i+b) = \hat{\gamma}_i \geq \hat{\gamma}, \quad i=1,\ldots,n$$
其中$\hat{\gamma}=\tilde{\gamma}|w|$.之前说过,即使超平面固定,$\tilde{\gamma}$的值也会随着$||w||$的变化而变化。由于我们的目标就是要确定超平面,因此可以将无关的变量固定下来,固定的方式有两种:一是固定$||w||$,当我们找到最优的$\tilde{\gamma}$时$\hat{\gamma}$也就随之而固定;二是反过来固定$\hat{\gamma}$,此时$||w||$也可以根据最优的$\tilde{\gamma}$得到。出于方便推导和优化的目的,我们选第二种,令$\hat{\gamma}=1$,则我们的目标函数化为:
$$\max \frac{1}{|w|}, \quad s.t., y_i(w^Tx_i+b)\geq 1, i=1,\ldots,n$$

支持向量作何理解

说了这么多,也没有说到Support vector(支持向量),仔细观看下图:
有两个支撑着中间的分界超平面的超平面,称为gap。它们到分界超平面的距离相等。这两个gap上必定会有一些数据点。如果没有,我们就可以进一步扩大margin了,那就不是最大的margin了。这些经过gap的数据点,就是支持向量(Support Vector)(它们支持了中间的超平面)。很显然,只有支持向量才决定超平面,其他的数据点不影响超平面的确定。
这是一个十分优良的特性。假设有100万个数据点,支持向量100个,我们实际上只需要用这100个支持向量进行计算!!!这将大大提高存储和计算的性能。

线性SVM的求解

考虑目标函数:$\max \frac{1}{|w|}, \quad s.t., y_i(w^Tx_i+b)\geq 1, i=1,\ldots,n$
由于求的$\frac{1}{||w||}$最大值相当于求$\frac{1}{2}|w|^2\quad$的最小值,所以上述目标函数等价于:
$$\min \frac{1}{2}|w|^2\quad s.t., y_i(w^Tx_i+b)\geq 1, i=1,\ldots,n$$
1/2是方便求导时约去。这时目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题可以用现成的QP(Quadratic Programming)的优化包进行求解。但是这个问题还有些特殊的结构,可以通过Lagrange Duality变换到对偶变量的优化问题。通常求解对偶变量优化问题的方法比QP优化包高效得多,而且推导过程中,可以很方便地引出核函数。
简单地说,通过给每个约束条件加上一个拉格朗日乘子,我们可以将它们融和到目标函数里去,拉格朗日函数如下:
$$\mathcal{L}(w,b,\alpha)=\frac{1}{2}|w|^2-\sum_{i=1}^n\alpha_i \left(y_i(w^Tx_i+b)-1\right)$$

这里还需要说明一点。当$x_i$不是支持向量时,$\alpha_i=0$;当$x_i$是支持向量时,$y_i(w^Tx_i+b)-1=0$。这个其实很好理解,因为超平面由支持向量决定,非支持向量不会影响到参数w。
这里省略掉推导的过程,这个函数经过变换,并且满足KKT条件。会得出如下结论:
$$w=\sum_{i=1}^n\alpha_iy_ix_i$$
$$\sum_{i=1}^n\alpha_iy=0$$

求解的问题可以变换为
$$\max_\alpha\sum_{i=1}^n\alpha_i-\frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j\quad s.t. \alpha_i\geq 0, i=1,\ldots,n $$

上式可以通过SMO算法求出拉格朗日乘子$\alpha$,进而求出$w$,通过$$b=-\frac{\max_{y_i=-1}w^Tx_i+\min_{y_j=1}w^Tx_j}{2}$$
,求出b

处理非线性问题

通过上面的讨论,我们表达了SVM的目标函数,并给出了求解的方法。于是SVM就讲完了,可以休息了?细心的读者一定发现,上面是在线性可分的前提下展开讨论的。线性不可分的时候怎么办?
那可不可以将非线性问题转换成线性问题呢?先来看个例子。

二维平面上,这是一个典型的线性不可分的问题。但我们增加一些特征,将数据点映射到高维空间,他就变成了线性可分的点集了。如下图:

事实上,将任何线性不可分的点集映射到高维空间(甚至可以到无穷维空间),总能变成线性可分的情况。只不过维数越高,计算量越大。维数大到无穷的时候,就是一场灾难了。
现在我们还是从数学上梳理一下这个映射的过程。
根据$w=\sum_{i=1}^n\alpha_iy_ix_i$,分类函数可写成:
$$f(x)=(\sum_{i=1}^n\alpha_iy_ix_i)^Tx+b=\sum_{i=1}^n\alpha_iy_ix_i^Tx+b=\sum_{i=1}^n\alpha_iy_i\langle x_i,x\rangle +b$$

$\langle ·\rangle$表示向量内积。这个形式的有趣之处在于,对新点x的预测,只需要计算它与训练数据点的内积即可。因为所有非支持向量所对应的系数$\alpha$都是0,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据。
经过映射,分类函数变成$$f(x)=\sum_{i=1}^n\alpha_iy_i\langle\phi(x_i),\phi(x)\rangle+b$$
而$\alpha$可以通过求解如下问题得到:
$$\max_\alpha\sum_{i=1}^n\alpha_i-\frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_j\langle \phi(x_i),\phi(x_j)\rangle\quad s.t. \alpha_i\geq 0, i=1,\ldots,n $$
这样,似乎是拿到非线性数据,就找一个适当的映射$\phi$,把原来的数据映射到新空间中,再做线性SVM即可。不过这个适当的映射可不是好惹的。二维空间做映射,需要5个维度,三维空间做映射,需要19个维度,维度数目是爆炸性增长的。到了无穷维,根本无法计算。这个时候就需要核函数出马了。
观察上式,映射只是一个中间过程,我们实际需要的是计算内积。如果有一种方式可以在特征空间中直接计算内积。就能很好地避免维数灾难了,这样直接计算的方法称为核函数方法。
核是一个函数$\kappa$,对所有$x_1$,$x_2$,满足$$\kappa(x_1,x_2)=\langle\phi(x_1),\phi(x_2)\rangle$$,这里$\phi$是从$x$到内积特征空间$F$的映射。

几个常用的核函数

通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:

  • 高斯核$\kappa(x_1,x_2) =
    \exp\left(-\frac{|x_1-x_2|^2}{2\sigma^2}\right)$,这个空间会将原始空间映射到无穷维空间。不过,如果$\sigma$选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的空间;反过来,如果$\sigma$选得很小的话,则可以将任意的数据映射为线性可分。当然,这不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维空间不可分数据通过高斯核函数映射到了高维空间:

  • 多项式核$$\kappa(x_1,x_2)=(\langle
    x_1,x_2\rangle+R)^d$$,这个核所对应的映射实际上是可以写出来的,该空间的维度是
    $\binom{m+d}{d}$,其中$m$是原始空间的维度。
  • 线性核$\kappa(x_1,x_2) = \langle
    x_1,x_2\rangle$,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

核函数的本质

总结一下核函数,实际是三点:

  • 实际中,当我们遇到线性不可分的样例,常用做法是把样例特征映射到高维空间中
  • 但如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的
  • 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。

处理噪音

回顾此前的介绍,SVM用来处理线性可分的问题。后来为了处理非线性数据,使用核函数将原始数据映射到高维空间,转化为线性可分的问题。但是有时候,并不是数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离正常位置很远的数据点,我们称之为outlier。超平面本身就是只有少数几个支持向量组成,如果支持向量里存在outlier,就会有严重影响。如下图:

用黑圈圈起来的那个蓝点就是一个outlier,它偏离了自己原本所应该的那个半空间,如果直接忽略掉,原本的分隔超平面还是挺好的,但是由于这个outlier的出现,导致分隔超平面不得不被挤歪了,变成黑色虚线所示,同时margin也相应变小了。更严重的是,如果outlier再往右上移动一些距离的话,将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM允许数据点在一定程度上偏离一下超平面。上图中,黑色实线所对应的距离,就是该outlier偏离的距离,如果把它移动回来,就刚好落在原来的超平面上,而不会使超平面发生变形了。具体来说,原来的约束条件变成:
$$y_i(w^Tx_i+b)\geq 1-\xi_i, i=1,\ldots,n$$
其中$\xi_i\geq 0$称为松弛变量,对应数据点$x_i$允许偏离的函数间隔的量。对于一般的数据(非支持向量,也非outlier),这个值就是0。如果$\xi_i$任意大的话,那任意的超平面都是符合要求的。所以,我们在原来的目标函数后面加上一项,使得这些$\xi_i$的总和也要最小:$$min\frac{1}{2}||w||^2 + C\sum_{i=1}^n\xi_i$$
,其中C是一个参数,用于控制目标函数中两项(寻找margin最大的超平面和保证数据点偏差最小)之间的权重。注意,$\xi_i$是需要优化的变量,而$C$是一个事先确定好的常量。完整的目标函数是:
$$min\frac{1}{2}||w||^2 + C\sum_{i=1}^n\xi_i\quad s.t. y_i(w^Tx_i+b)\geq 1-\xi_i, i=1,\ldots,n$$
通过拉格朗日对偶求解,
$$w=\sum_{i=1}^n\alpha_iy_ix_i$$
$$\sum_{i=1}^n\alpha_iy=0$$
求解的问题可以变换为
$$\max_\alpha\sum_{i=1}^n\alpha_i-\frac{1}{2}\sum_{i,j=1}^n\alpha_i\alpha_jy_iy_jx_i^Tx_j\quad s.t. 0\leq\alpha_i\leq C, i=1,\ldots,n $$
对比之前的结果,只不过是$\alpha$多了一个上限$C$。

总结

  • SVM是一个最大间距分类器。
  • 在线性可分的情况下,它的目标函数是$\min \frac{1}{2}|w|^2\quad s.t.,
    y_i(w^Tx_i+b)\geq 1, i=1,\ldots,n$,较好的求解方法是转换为拉格朗日对偶问题,并用SMO算法进行求解
  • 在线性不可分的情况下,其基本思想是,将低维线性不可分的问题映射为高维可分的问题。具体实现办法是:利用核函数,在低维空间进行运算,而将实质上的分类效果表现在高维上。
  • 考虑到数据点中可能存在噪音的干扰,需要将目标函数中加入松弛变量而求解的思路和方法不变。

SVM学习笔记(一)的更多相关文章

  1. SVM学习笔记

    一.SVM概述 支持向量机(support vector machine)是一系列的监督学习算法,能用于分类.回归分析.原本的SVM是个二分类算法,通过引入“OVO”或者“OVR”可以扩展到多分类问题 ...

  2. SVM学习笔记(二)----手写数字识别

    引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...

  3. SVM学习笔记(一):libsvm参数说明(转)

    LIBSVM 数据格式需要---------------------- 决策属性 条件属性a 条件属性b ... 2 1:7 2:5 ... 1 1:4 2:2 ... 数据格式转换--------- ...

  4. SVM学习笔记-线性支撑向量机

    对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的 Eout(w)≤Ein0+Ω(H)dvc= ...

  5. SVM学习笔记5-SMO

    首先拿出最后要求解的问题:$\underset{\alpha}{min}W(\alpha)=\frac{1}{2} \sum_{i,j=1}^{n}y^{(i)}y^{(j)}\alpha_{i}\a ...

  6. SVM学习笔记4-核函数和离群点的处理

    核函数在svm里,核函数是这样定义的.核函数是一个n*n(样本个数)的矩阵,其中:$K_{ij}=exp(-\frac{||x^{(i)}-x^{(j)}||^{2}}{2\sigma ^{2}})$ ...

  7. SVM学习笔记1-问题定义

    问题定义: 给出一些样本,包含两类.svm试图找到一个超平面,将数据分开,并且每种样本到超平面的距离的最小值最大. 输入样本:$\{x_{i},y_{i}| 1\leq i\leq n \}$,$y_ ...

  8. 机器学习6—SVM学习笔记

    机器学习牛人博客 机器学习实战之SVM 三种SVM的对偶问题 拉格朗日乘子法和KKT条件 支持向量机通俗导论(理解SVM的三层境界) 解密SVM系列(一):关于拉格朗日乘子法和KKT条件 解密SVM系 ...

  9. SVM学习笔记(二):什么是交叉验证

    交叉验证:拟合的好,同时预测也要准确 我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤.{A1,A2,A3,A4,A5,A6,A7,A8,A9} 为了简化,取 ...

随机推荐

  1. 自己如何正确获取MYSQL的ADO连接字符串

    1.下载安装MYSQL的ODBC数据库驱动程序(mysql-connector-odbc-5.3.4-win32.msi或者mysql-connector-odbc-5.3.4-winx64.msi) ...

  2. PS 流格式解析(转)

    对于PS流,最近因为工作需要,所以MPEG2中的PS流格式和解包过程进行了学习. 首先我们需要知道PS包流格式是怎么样的: 针对H264 做如下PS 封装:每个IDR NALU 前一般都会包含SPS. ...

  3. 开源项目UIL(UNIVERSAL-IMAGE-LOADER)

    1 http://www.cnblogs.com/osmondy/p/3266023.html 2 待续

  4. window 服务(二)

    接Window服务(一) ServiceController方法调用 public partial class Service1 : ServiceBase { public Service1() { ...

  5. SpannableString 设置一段文字中部分字体颜色

    SpannableString strTitle = new SpannableString("病情描述(必填项,请至少填写20个字)"); strTitle.setSpan(ne ...

  6. js中有特殊字符的编码格式

    在get和post方法中,如果传入的参数值有特殊字符,如:“&”,在get中的url需要拼接,可以使用encodeURICompontent来编码来转化 回调就是在上面传递实际参数,传递给aj ...

  7. websocket通讯协议(10版本)简介

    前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...

  8. PathInfo模式的支持

    pathinfo,一种伪静态的用法, 1.让 Apache 支持 PathInfo 配置的 Apache 版本 : 2.2.13 在配置文件中加入 <Files *.php> Accept ...

  9. 关于使用eclipse开发最小运行组件包

    有的时候向用eclipse组件,但是其中好多东西是相互关联的,如果在eclipse上做二次开发固然可以,但是有的时候想要的只不过是一个可以运行的架包而已,所以不必要那么多东西. 下面是我使用eclip ...

  10. android 二维码制作,显示到UI,并保存SD卡,拿来就能用!!

    转载请注明出处:王亟亟的大牛之路 如今二维码已经渗透了我们的生活.各种扫码关注啊.扫码下载的,今天上一个依据输入内容生成二维码的功能. 包结构: 界面截图: 功能:输入网址–>生成图片–> ...