在一个理想的分类当中,我们想要用一个超平面来将正类样本和负类样本划分开来。这个超平面的方程为 $\mathbf{w}^T\mathbf{x}+b=0$ 我们希望这个超平面能够使得划分更加的鲁棒,在图形上表现为超平面正好位于正类样本和负类样本的正中间,运用这种思想,我们引入了svm算法。

为什么正分类大于等于1而不是0

对于超平面$\mathbf{w}^T\mathbf{x}+b=0$,

分类为正的样本在平面的一侧,满足$\mathbf{w}^T\mathbf{x}_i+b  > 0 , y_i = +1$

分类为负的样本在平面的另一侧,满足为$\mathbf{w}^T\mathbf{x}_i+b  < 0 , y_i = -1$

我们总是能够找出一个正数t,无论t是0.001,还是1000或者其它的数字, 使得

分类为正的样本为$\mathbf{w}^T\mathbf{x}_i+b  \geq t , y_i = +1$

分类为负的样本为$\mathbf{w}^T\mathbf{x}_i+b  \leq -t , y_i = -1$

然后我们将式子两边同时除以t,也就是通过缩放变换

分类为正的样本为$\mathbf{w’}^T\mathbf{x}_i+b’  \geq 1, y_i = +1$

分类为负的样本为$\mathbf{w’}^T\mathbf{x}_i+b’  \leq -1 , y_i = -1$

而对于超平面$\mathbf{w}^T\mathbf{x}+b=0$, 和$\mathbf{w’}^T\mathbf{x}+b’=0$,两者表示的是一个平面。

上面的这些说明解释了一个问题:我们明明知道分类为正的样本是大于等于0,分类为负的样本小于等于0,但是很多推导当中写成了大于等于+1,小于等于-1。 原因是经过了缩放处理。

经过缩放处理以后,我们下面的式子为了方便依然用符号$\mathbf{w} 和 b 而不是 \mathbf{w’}、b’$。

假如我们把这个问题再深入思考一点,有两个平面 x+y+z-3=0 和 2x+2y+2z-6=0 表示的是同一个平面,但是代入同一个数字以后,如(2,2,2),得到的结果是不一样的,一个是3,一个是6. 如果按照这样算的话的确是不一样的,但是出现这个的原因是我们的坐标系缩放比例不一样了,前面那个3假如需要和2比较的话能够划分为正类,那么后面的6就需要和4进行比较能够划分为正类。

而我们上面的缩放处理以后,就是把所有得到的结果和1进行比较,并且两个最近的异类点距离超平面的距离之和为$\frac{2}{\Vert\mathbf{w}\Vert}$,我们的目标函数就是使得这个值最大。 经过一些列处理,我们得到了支持向量最初的优化式子

$\min \limits_{\mathbf{w}, b} \frac{1}{2}{\Vert \mathbf{w} \Vert}^2 $

$s.t.  \  y_i(\mathbf{w}^T\mathbf{x}_i+b)  \geq 1, i=1,2,…,m $

使用对偶方法和SMO方法进行优化求解

再求解上述的问题的时候,我们要用到一些优化的知识。首先是利用拉格朗日乘子法求它的对偶问题(注:下面不加下标的$\alpha$均为矢量)

$L(\mathbf{w},b, {\alpha}) = \frac{1}{2} {\Vert \mathbf{w} \Vert}^2 + \sum \limits_{i=1}^{m}\alpha_i (1-y_i(\mathbf{w}^T \mathbf{x}_i +b))$

用$L(\mathbf{w},b, \mathbf{\alpha}) $ 对 $\mathbf{w} 和 b$求偏导,并且为0可以得到:

$\mathbf{w} = \sum\limits_{i=1}^{m} \alpha_i y_i \mathbf{x}_i$

$0 = \sum \limits_{i=1}^{m}\alpha_i y_i$

将上面两个式子带入拉格朗日函数,

求出对偶问题的如下:

$\max \limits_\alpha \sum\limits_{i=0}^{m} \alpha _i  - \frac{1}{2}\sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i \alpha_j y_i y_j \mathbf{x}_i^T \mathbf{x}_j $

$s.t. \sum \limits_{i=1}^{m}\alpha_i y_i = 0$

$\alpha_i \geq 0 , i=1,2,3,…,m$

若求得$\alpha$ 以后,能够求得$\mathbf{w}和b$,带入可以得到如下结果:

$f(x)=\mathbf{w}^T \mathbf{x} +b$

$=\sum \limits_{i=1}^{m}\alpha_i y_i \mathbf{x}_i^T x +b$

下面是用序列最小优化算法(Sequential minimal optimization, SMO) 来求解其中的$\alpha$

SMO的思想是这样的,固定$\alpha_i$之外的其他参数,优化出$\alpha_i$的值,由于固定除$\alpha_i$以外的其它变量的时候,根据公式$\sum \limits_{i=1}^{m}\alpha_i y_i = 0$ 可以唯一确定$\alpha_i$ ,所以我们一次选择两个参数$\alpha_i$和$\alpha_j$进行优化,这样就能够求出所有的$\alpha$

求b的值的时候,可以根据所有支持向量$y_s f(\mathbf{x}_s)=1$ 这一约束来进行求解。

核函数:

理想情况下,我们的原始空间当中存在一个平面能够将正类和负类进行划分,但是实际情况下很难做到。我们可以寻找一个更高维平面,将数据映射到更高维上面进行划分。 比如在异或问题当中我们没有办法在二维平面上面找到一条直线,在这个时候,我们把数据映射到三维,在三维空间当中能够找到一个平面将数据进行划分。

所以,当我们对我们的问题重新进行优化的时候,我们想要使用一个函数$\phi 来将 \mathbf{x}_i $映射到高维空间。于是上面的对偶问题变为了这样:

$\max \limits_\alpha \sum\limits_{i=0}^{m} \alpha _i  - \frac{1}{2}\sum\limits_{i=1}^m\sum\limits_{j=1}^m\alpha_i \alpha_j y_i y_j  \phi{ (\mathbf{x}_i ) }^T \phi (\mathbf{x}_j) $

但是,映射到高维有一个问题,那就是计算量太大了,这个时候我们想要寻找一个函数$\kappa$在低维上面进行运算,它运算的结果和映射到高维上再进行计算的结果是一样的。即$\kappa(\mathbf{x}_i, \mathbf{x}_j) =\phi{ (\mathbf{x}_i ) }^T \phi (\mathbf{x}_j) $。幸运的是,我们根据一些条件能够找到这样一些函数,这些函数就是核函数。每一个核函数$\kappa$也对应着一种映射$\phi$。

常用的核函数:

线性核        $\kappa(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i^T \mathbf{x}_j$

多项式核     $\kappa(\mathbf{x}_i, \mathbf{x}_j) ={( \mathbf{x}_i^T \mathbf{x}_j )}^d$            $d \geq 1$为多项式的次数

高斯核        $\kappa(\mathbf{x}_i, \mathbf{x}_j)  = \exp (-\frac{{\Vert \mathbf{x}_i – \mathbf{x}_j\Vert}^2}{2 \sigma ^2})$      $\sigma >0$为高斯核的带宽(width)

拉普拉斯核    $\kappa(\mathbf{x}_i, \mathbf{x}_j)  = \exp (-\frac{\Vert \mathbf{x}_i – \mathbf{x}_j\Vert }{2 \sigma })$      $\sigma >0$

Sigmoid核    $\kappa(\mathbf{x}_i, \mathbf{x}_j) =  tanh(\beta \mathbf{x}_i^T \mathbf{x}_j + \theta) $     tanh为双曲正切函数 $\beta >0 , \theta <0$

其中线性核表示的是不进行变换,$\mathbf{x}_i^T \mathbf{x}_j$ 就映射为$\mathbf{x}_i^T \mathbf{x}_j$

以二次多项式核为例,我们可以得到它的映射函数:

$\kappa(\mathbf{x}, \mathbf{z}) = (\mathbf{x}^T\mathbf{z})^2$

= $\mathbf{x}^T\mathbf{z}\mathbf{x}^T\mathbf{z}$

= $\left( \sum \limits_{i=1}^{m} x_i z_i  \right) \left(\sum \limits_{j=1}^{m} x_j z_j\right)$

= $\sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}x_i x_j z_i z_j$

= $\sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}(x_i x_j)( z_i z_j)$

= $\phi(\mathbf{x})^T \phi(\mathbf{z})$

其中$\phi(\mathbf{x}) = \sum \limits_{i=1}^{m} \sum \limits_{j=1}^{m}x_i x_j $

比如一个向量为$(x_1; x_2; x_3)$映射以后变为$(x_1x_1\ ;x_1x_2\ ; x_1x_3 \ ;x_2x_1\ ;x_2x_2 \  ;x_2x_3\ ;x_3x_1\ ;x_3x_2\ ;x_3x_3)$   把一个3维的向量映射到9维上面。

幸而我们有了核函数,只需要在3维上面进行计算,而不是映射到9维上面然后再进行计算,这节省了很多的计算量。

软间隔和hinge损失

上面所讨论的问题都属于“硬间隔”,也就是把所有的样本都分类正确。 在实际过程当中,我们放宽这条限制,不一定让所有的样本满足$\  y_i(\mathbf{w}^T\mathbf{x}_i+b)  \geq 1, i=1,2,…,m $  但是我们还是希望这类样本越少越好,于是我们对不满足上面条件的样本进行惩罚,引入损失函数的概念。

我们利用上面的思想来对我们的目标函数进行优化,能够推导出来我们的svm算法其实使用的损失函数叫做hinge损失。这一部分内容在我的博客损失函数 svm和Hinge损失小节里面有介绍。

sklean中SVC的参数

我们来看一下sklearn.svm.SVC里面常用的参数

C:惩罚因子。 默认的情况是1.0。 C的值越大,对于误分类的惩罚越大,当C的值为无穷大的时候表示全部正确分类。 C的值越小,对于误分类的惩罚越小。

kernel: 核函数。 可以的取值为 线性核:‘linear’,多项式核:‘poly’,径向基核:‘rbf’,sigmoid核:‘sigmoid’,预定义核:‘precomputed’或者其它的可调用函数。

degree: 度。 多项式核‘poly’的度,默认为3,其它核忽略。

gamma:   ‘rbf’, ‘poly’ and ‘sigmoid’核的参数。如果gamma=‘auto’那么,将会使用1/n_features的值。

coef0:  核函数中的独立项,只在‘poly’ and ‘sigmoid’中有用。

参考:

支持向量机(三)核函数

《机器学习》 周志华

svm算法介绍的更多相关文章

  1. SVM算法

    本文主要介绍支持向量机理论推导及其工程应用. 1 基本介绍 支持向量机算法是一个有效的分类算法,可用于分类.回归等任务,在传统的机器学习任务中,通过人工构造.选择特征,然后使用支持向量机作为训练器,可 ...

  2. 机器学习笔记—svm算法(上)

    本文申明:本文原创,如转载请注明原文出处. 引言:上一篇我们讲到了logistic回归,今天我们来说一说与其很相似的svm算法,当然问题的讨论还是在线性可分的基础下讨论的. 很多人说svm是目前最好的 ...

  3. 【转】 SVM算法入门

    课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...

  4. SVM算法入门

    转自:http://blog.csdn.net/yangliuy/article/details/7316496SVM入门(一)至(三)Refresh 按:之前的文章重新汇编一下,修改了一些错误和不当 ...

  5. 转载:scikit-learn学习之SVM算法

    转载,http://blog.csdn.net/gamer_gyt 目录(?)[+] ========================================================= ...

  6. 一步步教你轻松学支持向量机SVM算法之案例篇2

    一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...

  7. Machine Learning in Action(5) SVM算法

    做机器学习的一定对支持向量机(support vector machine-SVM)颇为熟悉,因为在深度学习出现之前,SVM一直霸占着机器学习老大哥的位子.他的理论很优美,各种变种改进版本也很多,比如 ...

  8. (转载)python应用svm算法过程

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  9. Svm算法原理及实现

    Svm(support Vector Mac)又称为支持向量机,是一种二分类的模型.当然如果进行修改之后也是可以用于多类别问题的分类.支持向量机可以分为线性核非线性两大类.其主要思想为找到空间中的一个 ...

随机推荐

  1. python之supervisor进程管理工具

    supervisor是python写的一个管理进程运行的工具,可以很方便的监听.启动.停止.重启一个或多个进程:有了supervisor后,就不用字节写启动和监听的shell脚本了,非常方便. sup ...

  2. 016 sleep,wait,yield,join区别

    1.线程通常有五种状态,创建,就绪,运行.阻塞和死亡状态.2.阻塞的情况又分为三种:(1).等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中.进入 ...

  3. Linux创建ftp并设置权限以及忘记ftp帐号(密码)修改

    忘记ftp密码修改方法: 1.登录服务器 cd  /etc/vsftpdcat ftpusers找到对应的ftp用户名 (如果用户名也忘记了 那么 cd /etc 然后cat passwd 查看用户和 ...

  4. sad 关于一些html5新属性还需要用https才能支持

    像我昨天在搞一个录音的小东西 在本地正常录音正常播放 但是放到线上环境http环境上就出现了如上的错误 功能都不能正常使用 然后就改成https线上环境  然后就正常了 如上 大家有什么赐教的欢迎留言 ...

  5. 两天撸一个天气应用微信小程序

    更新说明: I.气象数据由百度地图开放平台修改为了和风天气,需要注册账号获取 key: II.d0e51c8 版本之后为小程序云开发版本,若未开通云开发功能,为不影响小程序正常运行,可以将版本号回退到 ...

  6. PyCharm中 ImportError: No module named tensorflow

    安装完 tensorflow 后在 PyCharm 中导入时显示找不到,可设置如下: PyCharm 中依次打开 File -> Settings -> Project:PycharmPr ...

  7. 三 Python解释器

    当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规范到解释器都是开源的 ...

  8. Python教程(一)Python简介

    Python就为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象地称作“内置电池(batteries included)”.用Python开发,许多功能不必从零 ...

  9. Windows 8.1 操作系统常用快捷键

    安装了 windows 8.1 有一段时间了,刚使用时有点儿不太习惯,后面知道了一些常用快捷键后,使用起来习惯多了.下面是一些常用的 Windows 8.1 快捷键: Ctrl + Tab: 访问所有 ...

  10. GDB 调试工具高级用法

    解决core核心文件转出问题 ulimit -c #查看core文件的生成开关,若为0则关闭 ulimit -c unlimited #打开开关,只在当前shell生效 sudo sh -c 'ech ...