zoukankan      html  css  js  c++  java
  • 支持向量机

    简介

    支持向量机(support vector machines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。由简至繁的模型包括:

    当训练样本线性可分时,通过硬间隔最大化,学习一个线性可分支持向量机;

    当训练样本近似线性可分时,通过软间隔最大化,学习一个线性支持向量机;

    当训练样本线性不可分时,通过核技巧和软间隔最大化,学习一个非线性支持向量机;

    支持向量机的优势在于:

    1)在高维空间中非常高效.

    2)即使在数据维度比样本数量大的情况下仍然有效.

    3)在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.

    4)通用性: 不同的核函数, 核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.

    支持向量机的缺点包括:

    1)如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化项是非常重要的.

    2)支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的.

    线性可分支持向量

    1、间隔最大化和支持向量

    如果一个线性函数能够将样本分开,称这些数据样本是线性可分的。那么什么是线性函数呢?其实很简单,在二维空间中就是一条直线,在三维空间中就是一个平面,以此类推,如果不考虑空间维数,这样的线性函数统称为超平面。我们看一个简单的二维空间的例子,O代表正类,X代表负类,样本是线性可分的,但是很显然不只有这一条直线可以将样本分开,而是有无数条,我们所说的线性可分支持向量机就对应着能将数据正确划分并且间隔最大的直线。

     

    那么我们考虑第一个问题,为什么要间隔最大呢?一般来说,一个点距离分离超平面的远近可以表示分类预测的确信度,如图中的A B两个样本点,B点被预测为正类的确信度要大于A点,所以SVM的目标是寻找一个超平面,使得离超平面较近的异类点之间能有更大的间隔,即不必考虑所有样本点,只需让求得的超平面使得离它近的点间隔最大。

    接下来考虑第二个问题,怎么计算间隔?只有计算出了间隔,才能使得间隔最大化。在样本空间中,划分超平面可通过如下线性方程来描述:

     

    其中w为法向量,决定了超平面的方向,b为位移量,决定了超平面与原点的距离。假设超平面能将训练样本正确地分类,即对于训练样本(xi,yi),满足以下公式:

     

    公式(2)称为最大间隔假设,yi=+1 表示样本为正样本,yi=−1表示样本为负样本,式子前面选择大于等于+1,小于等于-1只是为了计算方便,原则上可以是任意常数,但无论是多少,都可以通过对 w 的变换使其为 +1 和 -1 ,此时将公式(2)左右都乘以 yi,得到如下:

     

    实际上等价于:

     

    训练集中的所有样本都应满足公式(3)。如下图所示,距离超平面最近的这几个样本点满足 yi(wTxi+b)=1,它们被称为“支持向量”。虚线称为边界,两条虚线间的距离称为间隔(margin)。

     

    下面我们开始计算间隔,其实间隔就等于两个异类支持向量的差在 w 上的投影,即:

     

    其中 x⃗ +和 x⃗ 分别表示两个正负支持向量,因为 x⃗ + 和 x⃗ −满足yi(wTxi+b)=1,即:

     

    推出:

     

    代入公式(4)中可以得到:

     

    至此,我们求得了间隔,SVM的思想是使得间隔最大化,也就是:

     

    显然,最大化 相当于最小化 ||w||,为了计算方便,将公式(6)转化成如下:

     

    公式(7)即为支持向量机的基本型。

    2、对偶问题

    公式(7)本身是一个凸二次规划问题,可以使用现有的优化计算包来计算,但我们选择更为高效的方法。对公式(7)使用拉格朗日乘子法得到其对偶问题,该问题的拉格朗日函数可以写为:

     

    公式(8)分别对 w 和 b求偏导:

     

    令其分别为0,可以得到:

     

    将公式(9)(10)代入公式(8),可得:

     

    此时,原问题就转化为以下仅关于 α的问题:

     

    解出 αα 之后,根据公式(9)可以求得 w , 进而求得 b,可以得到模型:

     

    上述过程的KKT条件为:

     

    我们分析一下,对于任意的训练样本 (xi,yi)(xi,yi),

    (1)若 αi=0,则其不会在公式(13)中的求和项中出现,也就是说,它不影响模型的训练;

    (2)若 αi>0,则 yif(xi)−1=0,也就是yif(xi)=1,即该样本一定在边界上,是一个支持向量。

    这里显示出了支持向量机的重要特征:当训练完成后,大部分样本都不需要保留,最终模型只与支持向量有关。

    非线性支持向量机和核函数

    对于非线性问题,线性可分支持向量机并不能有效解决,要使用非线性模型才能很好地分类。先看一个例子,如下图,很显然使用直线并不能将两类样本分开,但是可以使用一条椭圆曲线(非线性模型)将它们分开。非线性问题往往不好求解,所以希望能用解线性分类问题的方法求解,因此可以采用非线性变换,将非线性问题变换成线性问题。

     

    对于这样的问题,可以将训练样本从原始空间映射到一个更高维的空间,使得样本在这个空间中线性可分,如果原始空间维数是有限的,即属性是有限的,那么一定存在一个高维特征空间是样本可分。令ϕ(x)表示将 x 映射后的特征向量,于是在特征空间中,划分超平面所对应的的模型可表示为:

     

    于是有最小化函数:

     

    其对偶问题为:

     

    若要对公式(16)求解,会涉及到计算 ϕ(xi)Tϕ(xj),这是样本 xi和 xj映射到特征空间之后的内积,由于特征空间的维数可能很高,甚至是无穷维,因此直接计算 ϕ(xi)Tϕ(xj)通常是困难的,于是想到这样一个函数:

     

    即 xi和 xj在特征空间中的内积等于他们在原始样本空间中通过函数 κ(xi,xj) 计算的函数值,于是公式(16)写成如下:

     

    求解后得到:

     

    这里的函数 κ(xi,xj)就是核函数,在实际应用中,通常人们会从一些常用的核函数里选择(根据样本数据的不同,选择不同的参数,实际上就得到了不同的核函数),下面给出常用的核函数:

    线性核:

     

    多项式核(d是多项式的次数,d=1是退化为线性核):

     

    高斯核(σ>0σ>0):

     

    拉普拉斯核(σ>0):

     

    sigmiod核(β>0,θ>0):

     

    线性支持向量机(软间隔支持向量机)与松弛变量

    1、线性支持向量机

    在前面的讨论中,我们假设训练样本在样本空间或者特征空间中是线性可分的,但在现实任务中往往很难确定合适的核函数使训练集在特征空间中线性可分,退一步说,即使瞧好找到了这样的核函数使得样本在特征空间中线性可分,也很难判断是不是由于过拟合造成。

    线性不可分意味着某些样本点 (xi,yi) 不能满足间隔大于等于1的条件,样本点落在超平面与边界之间。为解决这一问题,可以对每个样本点引入一个松弛变量 ξi≥0,使得间隔加上松弛变量大于等于1,这样约束条件变为:

     

    同时,对于每一个松弛变量 ξi≥0,支付一个代价 ξi≥0,目标函数变为:

     

    其中 C>0为惩罚参数,C值大时对误分类的惩罚增大, C值小时对误分类的惩罚减小,公式(21)包含两层含义:使 ||w||2 尽量小即间隔尽量大,同时使误分类点的个数尽量小,C是调和两者的系数。

    有了公式(21),可以和线性可分支持向量机一样考虑线性支持向量机的学习过程,此时,线性支持向量机的学习问题变成如下凸二次规划问题的求解(原始问题):

     

    2、对偶问题

    与线性可分支持向量机的对偶问题解法一致,公式(22)的拉格朗日函数为:

     

    其中 αi≥0,μi≥0 是拉格朗日乘子。

    令 L(w,b,α,ξ,μ)对 w,b,ξ的偏导数为0可得如下:

     

    将公式(24)(25)(26)代入公式(23)得对偶问题:

     

    解出 α之后,根据公式(9)可以求得 w , 进而求得 b,可以得到模型:

     

    上述过程的KKT条件为:

     

    我们分析一下,对于任意的训练样本 (xi,yi),总有 αi=0 或者 yif(xi)−1+ξi=0。

    若 αi=0 ,则该样本不出现在公式(13)中,不影响模型。

    若 αi>0,必有 yif(xi)−1+ξi=0 ,即yif(xi)=1−ξi ,此时该样本为支持向量。

    由于 C=αi+μi (公式26)

    若 αi<C,则必有μi>0,根据公式(28)知 ξi=0,即该样本恰好落在最大间隔的边界上;

    若 αi=C,则 μi=0,此时若 ξi≤1则该样本在最大间隔内部,若 ξi>1则样本分类错误。

    总结

    至此,关于SVM的三类问题:线性可分支持向量机与硬间隔最大化,非线性支持向量机与核函数,线性支持向量机与软间隔最大化一一介绍完毕:

    我们所面对的所有的机器学算法,都是有适用范围的,或者说,我们所有的机器学习算法都是有约束的优化问题。而这些约束,就是我们在推导算法之前所做的假设。

    比如:Logistics Regression,在Logistics Regression中,假设后验概率为Logistics 分布;再比如:LDA假设fk(x)是均值不同,方差相同的高斯分布;这些都是我们在推导算法之前所做的假设,也就是算法对数据分布的要求。

    而对于SVM而言,它并没有对原始数据的分布做任何的假设,这就是SVM和LDA、Logistics Regression区别最大的地方。这表明SVM模型对数据分布的要求低,那么其适用性自然就会更广一些。如果我们事先对数据的分布没有任何的先验信息,即,不知道是什么分布,那么SVM无疑是比较好的选择。

    但是,如果我们已经知道数据满足或者近似满足高斯分布,那么选择LDA得到的结果就会更准确。如果我们已经知道数据满足或者近似满足Logistics 分布,那么选择Logistics Regression就会有更好的效果。

    sklearn使用

    SVC()和NuSVC()

    # 分类器的训练,预测

    clf = svm.SVC()或者clf = svm.NuSVC()

    clf.fit(X, y)

    # 获得支持向量

    >>> clf.support_vectors_

    array([[ 0.,  0.],

         [ 1.,  1.]])

    # 获得支持向量的索引get indices of support vectors

    >>> clf.support_

    array([0, 1]...)

    # 为每一个类别获得支持向量的数量

    >>> clf.n_support_

    array([1, 1]...)

    SVC 和 NuSVC 为多元分类实现了 “one-against-one” 的方法 ,如果 n_class 是类别的数量, 那么 n_class * (n_class - 1) / 2 分类器被重构, 而且每一个从两个类别中训练数据.

    clf = svm.SVC(decision_function_shape='ovo')

    clf.fit(X, Y)   #假设分类数是4

    dec = clf.decision_function([[1]])

    dec.shape[1] # 4 classes: 4*3/2 = 6

    >>>6

    LinearSVC()

    LinearSVC 实现 “one-vs-the-rest” 多类别策略, 对于n分类问题,从而训练 n 类别的模型. 但是如果只有两类, 只训练一个模型。

    clf = svm.LinearSVC()

    clf.fit(X, Y)

    dec = lin_clf.decision_function([[1]])

    dec.shape[1]

    >>>4

    非均衡问题

    这个问题期望给予某一类或某个别样例能使用的关键词 class_weight 和 sample_weight 提高权重(importance).

    SVC (而不是 NuSVC) 在 fit 方法中生成了一个关键词 class_weight. 它是形如 {class_label : value} 的字典, value 是浮点数大于 0 的值, 把类 class_label 的参数 C 设置为 C * value.

    SVC, NuSVC, SVR, NuSVR 和 OneClassSVM 在 fit 方法中通过关键词 sample_weight 为单一样例实现权重weights.与 class_weight 相似, 这些把第i个样例的参数 C 换成 C * sample_weight[i].

  • 相关阅读:
    今天开始用 VSU 2010
    Visual Studio 2010 模型设计工具 基本应用
    Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
    Enterprise Library 4.1 Security Block 快速使用图文笔记
    解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)
    一个Oracle存储过程示例
    Enterprise Library 4.1 Application Settings 快速使用图文笔记
    Oracle 10g for Windows 简体中文版的安装过程
    Oracle 11g for Windows 简体中文版的安装过程
    Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)
  • 原文地址:https://www.cnblogs.com/yongfuxue/p/9971819.html
Copyright © 2011-2022 走看看