SVM 支持向量机算法原理(详细总结)和python代码实现

支持向量机是由Vapnik等人于1995年提出来的,是被公认的比较优秀的分类模型,逐渐受到了各领域研究者的关注。

支持向量机的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大化使它有别于感知机。学习策略是间隔最大化,可形式化求解一个凸二次规划的问题。

目录

Why Need SVM?

1 线性可分支持向量机

1.1 函数间隔和几何间隔

函数间隔

几何间隔

1.2 间隔最大化

1.3 支持向量和间隔边界

1.4 对偶算法

1.5 线性可分支持向量机学习算法

2 线性支持向量机

2.1 对偶学习算法

2.2  支持向量

2.3 合页损失函数

3 非线性支持向量机

3.1 核技巧

3.2 正定核

3.3 常用的核函数

3.3 非线性支持向量分类机

4 序列最小最优化算法

4.1 两个变量的二次规划的求解方法

4.2 变量的选择方法

1.第1个变量的选择

2.第2个变量的选择

3.计算阈值b和差值

5 支持向量回归(SVR)


Why Need SVM?

在感知机算法中,使用误分类样本到分隔超平面之间的距离作为损失函数,通过最小化误分类样本到超平面的距离,求得最终的超平面。但是分割超平面的参数W和b的初始值和选择不同的误分类样本,最终分隔超平面是不同的。所以,SVM的出现,就是从这些分隔超平面中选择一个最好的。

 

1 线性可分支持向量机

给定一个线性可分的训练集,T=\left \{ (x_{1},y_{1}), (x_{2},y_{2}),..., (x_{N},y_{N})\right \}找到一个间隔最大的分隔超平面w^{*}\cdot x+b^{*}=0,将两类数据正确划分。

分类确信度,一个正类样本点,被预测为正类,如果样本点距离超平面越近,预测结果的确信度越高,反之越低。负类样本如此。为了能表示分类预测的确信度,需要定义函数间隔和几何间隔。

 

1.1 函数间隔和几何间隔

函数间隔

对于给定的训练数据集T和超平面\left ( w,b \right ), 定义:

  • 超平面\left ( w,b \right )关于样本点\left ( x_{i},y_{i} \right )的函数间隔为:

     \hat{\gamma}_{i} =y_{i}(w\cdot x_{i}+b)

  • 超平面\left ( w,b \right )关于训练数据T 的函数间隔为  所有样本点\left ( x_{i},y_{i} \right ) 的函数间隔最小值:

      \hat{\gamma } = \underset{i=1,...,N}{min} \hat{\gamma }_{i}

使用函数间隔表示分类预测的正确性和确定性,存在的一个问题是,如果参数W和b同时扩大为原来的两倍,分隔超平面没有发生变化,但是函数间隔扩大为原来的两倍。为了解决这个问题,即,为了使得间隔使一个确定的值,需要引出几何间隔。

 

几何间隔

几何间隔是对分隔超平面的参数W加上一个约束,即归一化\left \| W \right \|=1, 

对于给定的训练数据集T和超平面\left ( w,b \right ), 定义:

  • 超平面\left ( w,b \right )关于样本点\left ( x_{i},y_{i} \right )的几何间隔为:

     \gamma_{i} =y_{i}(\frac{w}{||w||} \cdot x_{i}+\frac{b}{||b||})

  • 超平面\left ( w,b \right )关于训练数据T 的几何间隔为   所有样本点\left ( x_{i},y_{i} \right ) 的几何间隔最小值:

     \gamma = \underset{i=1,...,N}{min} \gamma _{i}

  • 函数间隔和几何间隔的关系如下:

     \gamma_{i} =\frac{\hat{\gamma}_{i} }{||w||}

     \gamma =\frac{\hat{\gamma} }{||w||}

SVM求解分隔超平面要满足两个条件:

  1. 正确划分训练数据集。
  2. 几何间隔最大,即距离分隔超平面最近的点的几何间隔最大。

 

1.2 间隔最大化

几何间隔最大的超平面:

考虑到函数间隔和几何间隔的关系,最优化问题可改写为:

由于当W和b同时扩大2倍,函数间隔\hat{\gamma }也会同时扩大为原来的2倍,这对于上述的优化问题和约束条件并没有影响,因此,可以取\hat{\gamma }=1,则上述最优化问题变成:

为什么要转化成上述形式?

凸二次规划问题:

SVM 支持向量机算法原理(详细总结)和python代码实现_第1张图片

 

1.3 支持向量和间隔边界

在线性可分情况下,训练数据集的样本点中与分隔超平面距离最近的样本点称为支持向量。

SVM 支持向量机算法原理(详细总结)和python代码实现_第2张图片

支持向量X^{i}对应的约束条件为:

y^{(i)}(W\cdot X^{(i)}+b )-1=0

y^{(i)}=+1时,支持向量所在的超平面为:

H_{1}: W\cdot X+b=1

y^{(i)}=-1时,支持向量所在的超平面为:

H_{1}: W\cdot X+b=-1

在确定最终的分隔超平面时,只有支持向量起作用,其他的样本点不起作用。

 

1.4 对偶算法

怎样求解线性可分支持向量机的最优化问题?采用对偶算法。根据拉格朗日对偶性,将原始问题转化为对偶问题,通过求解对偶问题的最优解\alpha,然后进一步求解原始问题的最优解Wb,这就是线性可分支持向量机的对偶算法。

采用对偶算法的优点,一是对偶算法往往更容易求解,二是自然的引入核函数,进而推广到非线性分类的问题。

首先,对每个不等式约束引入拉格朗日乘子 \alpha _{i}\geqslant 0,将其转化为无约束的最优化问题求解,定义以下拉格朗日函数:

      L(W,b,\alpha ) = \frac{1}{2}||W||^{2}-\sum_{i=1}^{N}\alpha _{i}y_{i}(W\cdot x_{i}+b)+\sum_{i=1}^{N}\alpha _{i}

其中,为拉格朗日乘子向量。

根据拉格朗日对偶性,原始问题是极小极大问题,对偶问题是极大极小问题:

      \underset{\alpha }{max}\: \underset{W,b }{min} \, \: \: L(W,b,\alpha )

为了得到对偶问题的解,需要先求L(W,b,\alpha )对W,b 的极小值,再对\alpha求极大值。

(1)L(W,b,\alpha )分别对W,b求导,令导数等于0:

       

得:

,     

代入拉格朗日函数,得:

       

(2) 求\underset{W,b}{min}L(W,b,\alpha )\alpha的极大,得到如下对偶问题。

       \underset{\alpha }{max}\: \: -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{j}x_{j})+\sum_{i=1}^{N}\alpha _{i}

        s.t.\: \: \: \sum_{i=1}^{N}\alpha _{i}y_{i}=0

        \alpha _{i}\geq 0, \: \: \: \: i=1,2,...,N

等价于:

SVM 支持向量机算法原理(详细总结)和python代码实现_第3张图片

对线性可分训练数据集,假设对偶最优化问题对\alpha的解为\alpha ^{*}=(\alpha _{1}^{*},\alpha _{2}^{*},...,\alpha _{N}^{*})^{T},可以由\alpha^{*}求得原始最优化问题对w和b的最优解w^{*}b^{*}

1.5 线性可分支持向量机学习算法

 

2 线性支持向量机

对于一个数据集,其中存在部分奇异点,无法找到一个超平面将两类数据完全分开,但将这些奇异点去除后,剩下的样本点组成的集合时线性可分的,该数据集为线性不可分数据集。线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,因为对于线性不可分的某些奇异点\left ( x_{i},y_{i} \right ),不能满足所有样本点的几何间隔大于等于分隔超平面关于数据集的几何间隔的约束条件,即函数间隔大于或等于1的约束条件。

为了解决这个问题,对每个样本点\left ( x_{i},y_{i} \right )引入一个松弛变量\xi \geq 0, 使得函数间隔加上松弛变量大于等于1。

线性不可分的线性支持向量机的学习问题变成如下凸二次规划问题:

      \underset{W,b,\xi }{min} \, \: \: \frac{1}{2}||W||^{2}+C\sum_{i=1}^{m}\xi _{i}

       

       \xi _{i}\geq =0, i=1,2,...,m

C为惩罚系数,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小。\frac{1}{2}||W||^{2}尽量小即间隔尽量大(因为间隔的大小为\frac{2}{\left \| W \right \|}),同时使误分类点的个数尽量小,C是调和二者的系数。

2.1 对偶学习算法

原始问题的拉格朗日函数为:

       

其中,

1)先求的极小:

         SVM 支持向量机算法原理(详细总结)和python代码实现_第4张图片

得:

        SVM 支持向量机算法原理(详细总结)和python代码实现_第5张图片

        

2)再对\alpha的极大,得到对偶问题:

        SVM 支持向量机算法原理(详细总结)和python代码实现_第6张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第7张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第8张图片

理论上,对任一适合条件的0<\alpha _{j}^{*}<C\alpha _{j}^{*}, 都可以求出b^{*},  线性支持向量机的解b的解不唯一,而是存在于一个区间。

2.2  支持向量

                                              SVM 支持向量机算法原理(详细总结)和python代码实现_第9张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第10张图片

2.3 合页损失函数

先行支持向量机学习还有另外一种解释,就是最小化以下目标函数:

目标函数的第1项是经验损失,函数称为合页损失函数(hinge loss function)。"+"表示取正值:

图中所示0-1损失函数是二分类分问题的真正损失函数,0-1损失函数非凸、非连续、数学性质不太好,使得目标函数不易直接求解,于是通常用其他一些函数替代0-1损失函数,而替代损失函数是0-1损失函数的上界,合页损失函数是一种常见的替代损失函数。

SVM 支持向量机算法原理(详细总结)和python代码实现_第11张图片

虚线是感知机的损失函数,当样本点被分类正确时,损失是0,否则是。相比之下,合页损失函数不仅要求分类正确并且要求函数间隔大于1时,损失才是0(否则损失是),所以,合页损失函数对学习有更高的要求。

SVM 支持向量机算法原理(详细总结)和python代码实现_第12张图片SVM 支持向量机算法原理(详细总结)和python代码实现_第13张图片

 

 

3 非线性支持向量机

对于非线性的分类问题,可以使用非线性支持向量机。

非线性问题往往不好求解,通常采取的方法是进行一个非线性变换,将非线性问题变换成线性问题,通过求解变换后的线性问题的方法来求解原来的非线性问题。 

3.1 核技巧

核技巧:使用一个线性变换将原空间的数据映射到新空间,然后在新空间里用线性分类学习方法从训练数据中学习分类模型。

核技巧应用到支持向量机的思想是,通过一个非线性变换将输入空间(欧氏空间)对应一个特征空间(希尔伯特空间),使得再输入空间中的超曲面模型对应于特征空间中的超平面模型,这样,分类问题的学习任务通过在特征空间中求解线性支持向量机就可以完成。

 

SVM 支持向量机算法原理(详细总结)和python代码实现_第14张图片

3.2 正定核

SVM 支持向量机算法原理(详细总结)和python代码实现_第15张图片

3.3 常用的核函数:

  • 多项式核函数

  • 高斯核函数

  • 字符串核函数

3.3 非线性支持向量分类机

将线性支持向量机扩展到非线性支持向量机,只需要将线性支持向量机对偶形式中的内积换成核函数。

SVM 支持向量机算法原理(详细总结)和python代码实现_第16张图片

K(x,z)是正定核函数时,问题时凸二次规划问题,解是存在的。

 

4 序列最小最优化算法

支持向量机的学习问题可以形式化为求解凸二次规划问题,这样凸二次规划问题具有全局最优解,但是,当训练样本容量很大时,一般的最优化算法变得低效,以致无法使用。如何解决这个问题?SMO算法能高效的实现支持向量机的学习。

SMO算法是要求解如下凸二次规划的对偶问题:

SVM 支持向量机算法原理(详细总结)和python代码实现_第17张图片

式中一个拉格朗日乘子对应一个样本点。

SMO算法的基本思路:如果所有变量的解都满足此最优问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解。更重要的是,这个子问题可以通过解析方法求解,大大提高了整个算法的计算速度。子问题有两个变量,一个是违反KKT条件最严重的那一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。

4.1 两个变量的二次规划的求解方法

选择两个变量\alpha _{1}\alpha _{2}, 固定其他变量。SMO最优化问题的子问题为:

分析\alpha _{1}\alpha _{2}的约束条件,7.102和7.103将两个变量限制在图中虚对角线上。

SVM 支持向量机算法原理(详细总结)和python代码实现_第18张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第19张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第20张图片

\alpha _{2}\alpha _{1}表示,代入目标函数中,对\alpha _{1}求导=0,得到\alpha _{1}旧值和新值的关系。

SVM 支持向量机算法原理(详细总结)和python代码实现_第21张图片

4.2 变量的选择方法

1.第1个变量的选择

第一个变量的选择在外层循环,选取违反KKT条件最严重的样本点作为第1个变量。

SVM 支持向量机算法原理(详细总结)和python代码实现_第22张图片

其中,

检验是在\varepsilon的范围内进行的。在检验过程中,首先遍历所有满足条件的样本点,即在间隔边界的支持向量点,检验它们是否满足KKT条件。如果都满足KKT条件,再遍历整个训练集,检验它们是否满足KKT条件。

2.第2个变量的选择

第二个变量选择在内层循环。

SVM 支持向量机算法原理(详细总结)和python代码实现_第23张图片

3.计算阈值b和差值E_{i}

每次完成两个变量\alpha _{1}\alpha _{2}的优化后,都要重新计算阈值b.

SVM 支持向量机算法原理(详细总结)和python代码实现_第24张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第25张图片

 

5 支持向量回归(SVR)

传统的回归模型通常直接基于模型输出f(x)与真实输出y之间的差值来计算损失,当模型输出和真实输出完全相同时,损失才为零。

支持向量回归能容忍f(x)y之间最多有\varepsilon的偏差,仅当f(x)y之间差别绝对值大于\varepsilon时才计算损失。如图所示,相当于以f(x)为中心,构建了一个宽度为2\varepsilon的间隔带,若训练样本落入间隔带,则认为时被预测正确的。

SV问题可形式化为:

其中,SVM 支持向量机算法原理(详细总结)和python代码实现_第26张图片

由于间隔带两侧的松弛程度可不同,引入松弛变量\xi _{i}\hat{\xi _{i}}, 优化函数为:

SVM 支持向量机算法原理(详细总结)和python代码实现_第27张图片

SVM 支持向量机算法原理(详细总结)和python代码实现_第28张图片

 

你可能感兴趣的:(机器学习)