SVM详解

Posted AoDeLuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVM详解相关的知识,希望对你有一定的参考价值。

文章目录


参考地址: https://zhuanlan.zhihu.com/p/77750026

1.支持向量

1.1 线性可分

在二维空间上,两类点被一条直线完全分开叫做线性可分。

严格的数学定义是:
D 0 D_0 D0 D 1 D_1 D1 n n n维欧氏空间中的两个点集。如果存在 n n n维向量 w w w和实数 b b b,使得所有属于 D 0 D_0 D0的点 x i x_i xi都有 w x i + b > 0 wx_i+b>0 wxi+b>0,而对于所有属于 D 1 D_1 D1的点 x j x_j xj则有 w x j + b < 0 wx_j+b<0 wxj+b<0,则我们称 D 0 D_0 D0 D 1 D_1 D1线性可分。

1.2 最大间隔超平面

从二维扩展到多维空间中时,将 D 0 D_0 D0 D 1 D_1 D1完全正确地划分开的 w x + b = 0 wx+b=0 wx+b=0就成了一个超平面。为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。

  • 两类样本分别分割在该超平面的两侧;
  • 两侧距离超平面最近的样本点到超平面的距离被最大化了。

1.3 支持向量

样本中距离超平面最近的一些点,这些点叫做支持向量。

1.4 SVM最优化问题

SVM想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:

w T x + b = 0 w^T x+b=0 wTx+b=0

二维空间点 ( x , y ) (x,y) (x,y)到直线 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0的距离公式是:

∣ A x + B y + C ∣ A 2 + B 2 \\frac|A x+B y+C|\\sqrtA^2+B^2 A2+B2 Ax+By+C

扩展到 n n n维空间后,点 x = ( x 1 , x 2 . . . x n ) x=(x_1,x_2...x_n) x=(x1,x2...xn)到直线 w T x + b = 0 w^Tx+b=0 wTx+b=0的距离为:

∣ w T x + b ∣ ∥ w ∥ \\frac\\left|w^T x+b\\right|\\|w\\| w wTx+b

其中 ∥ w ∥ = w 1 2 + … w n 2 \\|w\\|=\\sqrtw_1^2+\\ldots w_n^2 w=w12+wn2 。如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d d d,其他点到超平面的距离大于 d d d

于是我们有这样的一个公式:

w T x + b ∥ w ∥ ≥ d y = 1 w T x + b ∥ w ∥ ≤ − d y = − 1 \\left\\\\beginarrayl \\fracw^T x+b\\|w\\| \\geq d \\quad y=1 \\\\ \\fracw^T x+b\\|w\\| \\leq-d \\quad y=-1 \\endarray\\right. wwTx+bdy=1wwTx+bdy=1

稍作转化可以得到:

w T x + b ∥ w ∥ d ≥ 1 y = 1 w T x + b ∥ w ∥ d ≤ − 1 y = − 1 \\left\\\\beginarrayll \\fracw^T x+b\\|w\\| d \\geq 1 \\quad y & =1 \\\\ \\fracw^T x+b\\|w\\| d \\leq-1 & y=-1 \\endarray\\right. wdwTx+b1ywdwTx+b1=1y=1

∣ ∣ w ∣ ∣ d ||w||d ∣∣w∣∣d是正数,我们暂且令它为1(之所以令它等于1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),故:

w T x + b ≥ 1 y = 1 w T x + b ≤ − 1 y = − 1 \\left\\\\beginarrayll w^T x+b \\geq 1 & y=1 \\\\ w^T x+b \\leq-1 & y=-1 \\endarray\\right. wTx+b1wTx+b1y=1y=1

将两个方程合并,我们可以简写为:

y ( w T x + b

SVM -支持向量机原理详解与实践之四

SVM -支持向量机原理详解与实践之四

  1. SVM原理分析

    1. SMO算法分析

SMO即Sequential minmal optimization, 是最快的二次规划的优化算法,特使对线性SVM和稀疏数据性能更优。在正式介绍SMO算法之前,首先要了解坐标上升法。

  1. 坐标上升法(Coordinate ascent)

坐标上升法(Coordinate Ascent)简单点说就是它每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。

  1. 坐标上升法原理讲解

为了更加通用的表示算法的求解过程,我们将算法表示成:

 

3.13-1

坐标上升法的算法为:

这个算法中最为关键的地方就是内循环对于的求解,意思是固定除了之外的所有a(从i=1~m),也就是说将除外的其他变量看成是常数,并且将W看做是关于的函数,那么直接对求导优化得到极大值,在上面算法的版本中,内循环优化变量的顺序是但是一个更高级的版本可能选择其它的顺序,例如我可以根据我们的期望来选择下一个变量来更新,并让W(a)有最大的增加。

当函数W在内循环中能够最快的达到最优,则坐标上升是一个有效的算法,下面是一个坐标上升的示意图:

上图中的椭圆形线代表我们需要优化问题的二次函数的等高线,变量数为2,起始坐标是(2,2),途中的直线是迭代优化的路径,可以看到每一步都会相最优值前进一步,而且前进的路线都是平行与相应的坐标轴的,因为每次只优化一个变量。

 

  1. C++算法编程实践

问题:求解函数的最大值。

解:回顾我们前面分析的求取函数最大值的关键是,求解每一个迭代变量的导数,当求解某一变量的导数的时候,其他的变量看做是常数:

VS2013控制台工程参考代码如下:

// Coordinate ascent.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

 

 

#include <iostream>

using namespace std;

#define f(x1,x2,x3) (-x1*x1-2*x2*x2-3*x3*x3+2*x1*x2+2*x1*x3-4*x2*x3+6)

int _tmain(int argc, _TCHAR* argv[])

{

    double x1 = 1;

    double x2 = 1;

    double x3 = 1;

    double f0 = f(x1, x2, x3);

    double err = 1.0e-10;

    while (true)

    {

        x1 = x2 + x3; //x1求导的表达式,每次迭代后更新

        x2 = 0.5*x1 - x3; //x2求导的表达式,每次迭代后更新

        x3 = 1.0 / 3 * x1 - 2.0 / 3 * x2; //x3求导的表达式,每次迭代后更新

        double ft = f(x1, x2, x3); //求函数值

        if (abs(ft - f0)<err) //判断f是否收敛

        {

            break; //收敛即完成求解过程

        }

        f0 = ft; //更新f0

    }

    cout << "\\nmax{f(x1,x2,x3)}=" << f(x1, x2, x3) << endl;

    cout << "取得最大值时的坐标:\\n(x1,x2,x3)=(" << x1 << "," << x2 << "," << x3 << ")" << endl;

    system("pause");

    return 0;

}

运行结果如下:

  1. SMO算法详解

回到我们软间隔与正则化章节(还有最优间隔分类器),我们的对偶问题,就是通过固定拉格朗日乘子a,得到w和b的最优化表达式(关于a的表达式),所以最后我们只需要确认a,我们就可以最终确定w和b,但是在讨论SMO算法之前,我们并没有真正求解出。这一章我们就会通过介绍SMO算法对对偶问题最后需要解决的问题:

做出一个求解,也就是在参数上求W最大值的问题,注意其中的就是训练样本的输入,x即为样本的输入特征,y即样本对应的标签(结果)。

按照前面介绍的坐标上升的思路,我们首先固定除了以外的所有参数,然后在上求极值。现在下面先固定以外的所有参数,看看具体的求解步骤:

  1. 首先由优化问题的约束条件可知:

即可推出

 

 

两边乘以:

 
 

(3.13.2-1)

因为,所以,因此到这一步,就由其它的决定,如果我们固定主,无论如何不能违背优化问题的约束

    因此如果我们想要更新一些的对象,为了保持满足约束条件就必须至少快速的更新它们中的两个,这个就激发出SMO算法,那么SMO算法可以简单的描述成:

重复大括号中的操作直到收敛{

  1. 选择一对来更新下一个(用启发式的方法,也就是尝试选取两个允许我们朝着全局最大方向做最大前进的参数)
  1. 固定所有其它的参数,优化关于的函数W(a)

}

为了测试该算法的收敛性,我们可以检查KKT条件:

是否满足收敛容错参数,典型值为0.1~0.001之间。

SMO作为一个高效的算法的关键原因在于计算更新的效率非常高。假设当前我们有一些满足(3.10.3-5)的约束,固定,想要优化关于的函数,用表示有:

 

 

由于右边固定,我们可以直接用一个常数表示,例如用表示:

于是我可以将的约束画出来:

根据约束条件:

可知上图中表示的横轴和纵轴必须限制在0到C的方框内,并且也要在直线上。并且的纵轴也必须满足,否则就不能满足约束条件。

下面用表示,过程是:

其中,因为,所以有:

所以目标问题W可以表示为:

其中为常数。

实际的问题中W展开后就是一个关于的二次函数, A、B、C是固定值,这样通过对W进行求导可得,然而要保证满足,我们使用 表示求导求出的, 然而最后的,需要根据下面的情况得到:

求出以后,我们可以就可以得到

 

  1. 支持向量机实践

这里限于篇幅,实践的内容将在下一篇展开…

以上是关于SVM详解的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 详解支持向量机(附学习资源)

机器学习入门之四:机器学习的方法--SVM(支持向量机)(转载)

机器学习算法——SVM支持向量机(Ⅱ)

机器学习的分类算法之SVM(支持向量机)

机器学习算法-python实现svm支持向量机—理论知识介绍

白话机器学习算法理论+实战之支持向量机(SVM)