在一个理想的分类当中,我们想要用一个超平面来将正类样本和负类样本划分开来。这个超平面的方程为 $\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. ip_rcv && ip_rcv_finish

    (1) 在inet_init中注册了类型为ETH_P_IP协议的数据包的回调ip_rcv (2) 当二层数据包接收完毕,会调用netif_receive_skb根据协议进行向上层分发 (3) 类型为E ...

  2. React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?

    〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...

  3. slf4j中的Logger 使用占位符{} 来传入参数记录日志信息

    首先要导入 slf4j包中的2个类 import org.slf4j.Logger;import org.slf4j.LoggerFactory; 再定义如下 private final static ...

  4. poj 2337(单向欧拉路的判断以及输出)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11648   Accepted: 3036 Descrip ...

  5. python datetime 时区(timezone) dateutil

    记录下python中的时区问题, 代码如下:  包括datetime.datetime对象使用不同的时区,以及在不同时区间转换. from datetime import datetime from ...

  6. Eclipse中用两个控制台测试网络通信程序

    1.启动发送端和接收端程序,这时在控制台可以看到两个程序在运行,如下图. 2.这种情况下只有一个控制台窗口,不便于测试程序,于是新建一个控制台窗口,如下图. 3.这时可以发现已经有了两个控制台窗口了, ...

  7. 【U3D】播放器设置(PlayerSettings)

    播放器设置 (Player Settings) 播放器设置 (Player Settings) 用于为您要在 Unity 中编译的最终游戏定义各项(特定于平台的)参数.例如,参数中的一些值用于您打开单 ...

  8. Python 爬虫笔记(三)

    from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #Act ...

  9. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果

    题目描述 圣诞节临近,彩虹岛的黑心商人

  10. 深入理解Java引用类型

    深入理解Java引用类型 在Java中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class ...