支持向量机 订阅
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) [1-3]  。SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 [2]  。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 [4]  。SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用 [5-6]  。 展开全文
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) [1-3]  。SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 [2]  。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 [4]  。SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用 [5-6]  。
信息
 提出时间
1964年 [7]
外文名
Support Vector Machine, SVM
提出者
V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等
类    型
机器学习算法
中文名
支持向量机
学    科
统计学,人工智能
应    用
计算机视觉,自然语言处理,生物信息学
支持向量机历史
SVM是由模式识别中广义肖像算法(generalized portrait algorithm)发展而来的分类器 [8]  ,其早期工作来自前苏联学者Vladimir N. Vapnik和Alexander Y. Lerner在1963年发表的研究 [9]  。1964年,Vapnik和Alexey Y. Chervonenkis对广义肖像算法进行了进一步讨论并建立了硬边距的线性SVM [7]  。此后在二十世纪70-80年代,随着模式识别中最大边距决策边界的理论研究 [10]  、基于松弛变量(slack variable)的规划问题求解技术的出现 [11]  ,和VC维(Vapnik-Chervonenkis dimension, VC dimension)的提出 [12]  ,SVM被逐步理论化并成为统计学习理论的一部分 [1]  。1992年,Bernhard E. Boser、Isabelle M. Guyon和Vapnik通过核方法得到了非线性SVM [13]  。1995年,Corinna Cortes和Vapnik提出了软边距的非线性SVM并将其应用于手写字符识别问题 [14]  ,这份研究在发表后得到了关注和引用,为SVM在各领域的应用提供了参考。
收起全文
精华内容
参与话题
问答
  • 支持向量机SVM、支持向量回归SVR详细推导

    万次阅读 多人点赞 2019-06-30 09:31:52
    文章详细介绍了支持向量机SVM及其拓展,支持向量回归SVR.并从线性分类和非线性分类的角度出发,详细推导了硬间隔、软间隔和核函数的支持向量机。

    目录


    一、SVM简介

    简介:SVM的英文全称是Support Vector Machines,中文叫支持向量机。支持向量机是我们用于分类的一种算法。支持向量也可以用于回归,此时叫支持向量回归(Support Vector Regression,简称SVR)。

    发展历史:1963年,ATE-T Bell实验室研究小组在Vanpik的领导下,首次提出了支持向量机(SVM)理论方法。但在当时,SVM在数学上不能明晰地表示,人们对模式识别问题的研究很不完善,因此SVM的研究没有得到进一步的发展与重视。 1971年,Kimeldorf提出了使用线性不等约束重新构造SV的核空间,使一部分线性不可分的问题得到了解决。20世纪90年代,一个比较完善的理论体系——统计学习理论(Statistical Learning Theory,SLT)形成了,此时一些新兴的机器学习方法(如神经网络等)的研究遇到了一些重大的困难,比如欠学习与过学习问题、如何确定网络结构的问题、局部极小点问题等,这两方面的因素使得SVM迅速发展和完善,并在很多问题的解决中表现出许多特有优势,而且能够推广应用到函数拟合等其他机器学习问题中,从此迅速发展了起来,目前已经成功地在许多领域里得到了成功应用。

    思想:SVM的主要思想可以概括为如下两点:
    (1)它是针对线性可分的情况进行分析的。对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间,使其线性可分,从而使得在高维特征空间中采用线性算法对样本的非线性特征进行线性分析成为可能。
    (2)它基于结构风险最小化理论,在特征空间中构建最优分类面,使得学习器能够得到全局最优化,并且使整个样本空间的期望风险以某个概率满足一定上界。
      从上面的两点基本思想来看,SVM没有使用传统的推导过程,简化了通常的分类和回归等问题;少数的支持向量确定了SVM 的最终决策函数,计算的复杂性取决于支持向量,而不是整个样本空间,这就可以避免“维数灾难”。少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。

    数学基础:拉格朗日乘子法、对偶问题、KKT条件

    应用:人脸检测、验证和识别,说话人/语音识别,文字/手写体识别 ,图像处理等等

    二、推导过程

    SVM有三宝:间隔、对偶、核技巧。
    遇到的问题大致可以分为线性可分和线性不可分的情况,因此,我将分开介绍:

    1.线性可分

    1.1 硬间隔

    1. 基本模型

    训练样本集D={(x1,y1),(x1,y1),(xm,ym)},yi=1yi=1D=\{(x_{1},y_{1}),(x_{1},y_{1}),……,(x_{m},y_{m})\},y_{i}=1或y_{i}=-1,分类学习的思想:找一个划分超平面,将不同类别的样本分开。

    在这里插入图片描述
    划分的超平面很多,我们去找哪一个?直观上看,我们应该找位于两类训练样本“正中间”的超平面。

    在样本空间中,划分超平面可通过如下线性方程来描述:wTx+b=0{\color{Red} w^{T}x+b=0}
    w=(w1;w2;;wd)w=(w_{1};w_{2};…;w_{d})为法向量,决定了超平面的方向;b为位移项,决定了超平面与原点之间的距离。
    显然,划分超平面可被法向量w和位移b确定,下面我们将其记为(w,b)。 样本空间中任意点x到超平面(w,b)的距离可写为r=wTx+bw{\color{Red} r=\frac{\left | w^{T}x+b \right |}{\left \| w \right \|}}
    假设超平面(w,b)能将训练样本正确分类,即对(xi,yi)D(x_{i},y_{i} )\in D,若yi=+1y_{i}=+1,则wTxi+b>0w^{T}x_{i}+b>0.否则:wTxi+b<0w^{T}x_{i}+b<0,令
    在这里插入图片描述
    对应如下:
    在这里插入图片描述
    问题只与投影方向有关,一旦方向定了,通过缩放w和b,总能使上式成立。所以,求超平面的问题转化为求w和b的问题。

    如下图所示,距离超平面最近的这几个训练样本点使上式的等号成立,它们被称为“支持向量”(support vector),两个异类支持向量机到超平面的距离之和为 :r=wTx+bw{\color{Red} r=\frac{\left | w^{T}x+b \right |}{\left \| w \right \|}}
    在这里插入图片描述
    上图中,两条虚线之间的距离为:γ=2w\gamma =\frac{2}{\left \| w \right \|},将其称之为间隔。欲找到具有“最大间隔”(maximum margin)的划分超平面,也就是找到参数w和b,使得γ最大,即:
    在这里插入图片描述
    上面的约束等价于如下约束:
    在这里插入图片描述
    即支持向量机(Support Vector Machine,简称SVM)的基本型。

    2. 模型求解

    上式中,其中w和b是模型参数。注意到上式本身是一个凸二次规划问题,能直接用现成的优化计算包求解,但我们可以有更高效的办法,可以求出闭式解。
    对式使用拉格朗日乘子法可得到其“对偶问题”(dual problem):
    在这里插入图片描述
    其中α=(α1;α2;;αm)\alpha =(\alpha _{1};\alpha _{2};…;\alpha _{m}),令L(w,b,α)L(w,b,\alpha)对w和b的偏导数等于零得:
    在这里插入图片描述
    将第一个式代入L,即可将L(w,b,α)L(w,b,α)中的w和b消去,再考虑第二个式的约束,就得到对偶问题:
    在这里插入图片描述
    解出α后,求出w和b即可得到模型:
    在这里插入图片描述
    从对偶问题解出的αiα_i是拉格朗日乘子,它恰对应着训练样本(xi,yi)(x_i,y_i)。注意到支持向量机最优化问题中有不等式约束,因此上述过程需满足KKT条件,即要求:
    在这里插入图片描述
    最后一个条件,对任意训练样本(xi,yi)(x_i,y_i),总有αi=0\alpha _{i}=0yif(xi)=1y_{i}f(x_{i})=1.
    则有以下两种情况:
    (1) 若αi=0α_i=0,则该样本将不会在求和中出现,不会对f(x)有任何影响;
    (2) 若αi>0α_i>0,则必有yif(xi)=1y_i f(x_i )=1,位于最大间隔边界上,是一个支持向量。
    在这里插入图片描述
    这显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关.

    如何求解αiα_i:二次规划问题,通过SMO算法求解。
    基本思路:每次选择两个变量α_i和α_j,并固定其他参数。这样,在参数初始化后,SMO不断执行如下两个步骤直至收敛:
    (1) 选取一对需更新的变量αiα_iαjα_j
    (2) 固定αiα_iαjα_j以外的参数,求解式获得更新后的αiα_iαjα_j.

    分析:KKT条件违背的程度越大,则变量更新后可能导致的且标函数值减幅越大。
    第一个变量:SMO先选取违背KKT条件程度最大的变量。
    第二个变量:应选择一个使且标函数值减小最快的变量,使选取的两变量所对应样本之间的间隔最大。

    为什么更新两个,而非一个?原因是,若仅选择一个,则其可有其他变量导出。因此更新两个。
    在这里插入图片描述
    SMO算法之所以高效,是由于在固定其他参数后,仅优化两个参数的过程能做到非常高效
    之前的优化问题:
    在这里插入图片描述
    仅考虑αiα_iαjα_j时,式中的约束可重写为:
    在这里插入图片描述
    其中c是使i=0mαiyi=0∑_{i=0}^mα_i y_i=0成立的常数。用αiyi+αjyj=cα_i y_i+α_j y_j=c消去上式中的变量αjα_j,则得到一个关于αiα_i的单变量二次规划问题,仅有的约束是αi0α_i≥0
    不难发现,这样的二次规划问题具有闭式解,于是不必调用数值优化算法即可高效地计算出更新后的αiα_iαjα_j.

    确定偏移项b
    対任意支持向量(xi,yk)(x_i,y_k) 都有ysf(xs)=1y_s f(x_s )=1,即
    在这里插入图片描述
    其中S={iαi>0,i=1,2,,m}S=\{i|α_{i}>0,i=1,2,…,m\} 为所有支持向量的下标集,但现实任务中常采用一种更鲁棒的做法:使用所有支持向量求解的平均值
    在这里插入图片描述

    1.2 软间隔

    在现实任务中往往很难确定合适的核函数使得训练样本在特征空间中线性可分。
    缓解该问题的一个办法是允许支持向量机在一-些样本上出错.为此,要引入“软间隔”的概念,如图所示:
    在这里插入图片描述
    在最大化间隔的同时,不满足约束的样本应尽可能少.于是,优化目标可写为:
    在这里插入图片描述
    即,在间隔上加一个损失,允许错分,但是损失应该尽量小。

    (1)0/1损失函数
    在这里插入图片描述
    显然,当C为无穷大时,迫使所有样本均满足约束,于是等价于经典支持向量机方法;
    当C取有限值时,允许一些样本不满足约束。
    然而,l0/1l_{0/1}非凸、非连续,不易直接求解。人们通常用其他一些函数来代替l0/1l_{0/1},称为“替代损失”(surrogate loss),通常是凸的连续函数且是l0/1l_{0/1}的上界。

    (2)hinge损失函数
    若采用hinge损失,则代价函数变成:
    在这里插入图片描述
    引入“松弛变量”(slack variables)ξi0ξ_i≥0,可将重写为:
    在这里插入图片描述
    这就是常用的“软间隔支持向量机”。
    (3)其他损失函数

    在这里插入图片描述
    损失函数:
    在这里插入图片描述
    标准:>0时,尽可能小,<0时,尽可能大。从而保证分类的准确性。

    2.线性不可分(核函数)

    我们假设训练样本是线性可分的,超平面能将训练样本正确分类。然而在现实任务中,原始样本空间内也许并不存在一个能正确划分两类样本的超平面。例如图中的“异或”问题就不是线性可分的.
    在这里插入图片描述
    对这样的问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。

    例如在图中,若将原始的二维空间映射到一个合适的三维空间,就能找到一个合适的划分超平面。
    在这里插入图片描述
    如何映射?有没有通用的办法?

    幸运的是,如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。 令∅(x)表示将x映射后的特征向量,于是,在特征空间中划分超平面所对应的模型可表示为:
    在这里插入图片描述
    其中w和b是模型参数。
    问题转化为:
    在这里插入图片描述
    其对偶问题是:
    在这里插入图片描述
    求解式涉及到计算ϕ(xi)Tϕ(xj)ϕ(x_i )^T ϕ(x_j ),这是样本xix_ixjx_j映射到特征空间之后的内积。
    由于特征空间维数可能很高,甚至可能是无穷维,因此直接计算ϕ(xi)Tϕ(xj)ϕ(x_i )^T ϕ(x_j )通常是困难的。
    为了避开这个障碍,可以设想这样一个函数:
    在这里插入图片描述
    xix_ixjx_j在特征空间的内积等于它们在原始样本空间中通过函数κ(∙,∙ )计算的结果。

    有了这样的函数,我们就不必直接去计算高维甚至无穷维特征空间中的内积。

    于是式可重写为:
    在这里插入图片描述
    于是,求解后即可得到:
    在这里插入图片描述
    这里的函数κ(∙,∙ )就是“核函数”(kernel function)。上式显示出模型最优解可通过训练样本的核函数展开,这一展式亦称“支持向量展式”(support vector expansion)。

    问题:显然,若已知合适映射ϕ(∙)的具体形式,则可写出核函数κ(∙,∙ ),但在现实任务中我们通常不知道ϕ(∙)是什么形式。

    合适的核函数是否一定存在呢?什么样的函数能做核函数呢?
    答案是肯定的。

    定理(核函数) 令χ为输入空间,κ(∙,∙ )是定义在χ×χχ×χ上的对称函数,则κ是核函数当且仅当对于任意数据D={x1,x2,,xm}D=\{x_{1},x_{2},…,x_{m}\},“核矩阵”(kernel matrix)K总是半正定的:
    在这里插入图片描述
    定理表明,只要一个对称函数所对应的核矩阵半正定,它就能作为核函数使用。

    在不知道特征映射的形式时,我们并不知道什么样的核函数是合适的,“核函数选择”成为支持向量机的最大变数。

    通常,可选择如下核函数,选择性能最优者作为某一问题的核函数:
    在这里插入图片描述
    注意:当d=1时,高斯核也成为径向基核函数(RBF)核。

    此外,还可通过函数组合得到,例如:
    (1) 若κ_1和κ_2为核函数,则对于任意正数γ1γ2γ_1、γ_2,其线性组合也是核函数:
    γ1κ1+γ2κ2γ_1 κ_1+γ_2 κ_2

    (2) 若κ_1和κ_2为核函数,则核函数的直积也是核函数;
    κ1κ2(x,z)=κ1(x,z)κ2(x,z)κ_1 ⊗κ_2 (x,z)=κ_1 ( x,z)κ_2 (x,z)

    (3) 若κ_1为核函数,则对于任意函数g(x),也是核函数;
    κ(x,z)=g(x)κ1(x,z)g(z)κ(x,z)=g(x)κ_1 (x,z)g (z)

    3.SVR支持向量回归

    给定训练样本D={(x1,y1),(x1,y1),(xm,ym)},yiRD=\{(x_{1},y_{1}),(x_{1},y_{1}),……,(x_{m},y_{m})\},y_{i}∈R,希望学得一个回归模型,使得f(x)f(x)yy尽可能接近,wwbb是待确定的模型参数。
    在这里插入图片描述
    假设我们能容忍f(x)f(x)yy之间最多有ϵϵ的偏差,即仅当f(x)f(x)yy之间的差别绝对值大于ϵϵ时才计算损失.

    于是,SVR问题可形式化为:
    在这里插入图片描述
    其中C为正则化常数,lϵl_ϵ是图中所示的ϵ -不敏感损失(ϵ -insensitive loss)函数:
    在这里插入图片描述
    引入松弛变量ξiξ_i(ξi)(ξ_i ),可将式重写为:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190630091142826.png
    在这里插入图片描述
    引入拉格朗日乘子μiμ_i
    在这里插入图片描述
    再令L(w,b,α,α^,ξ,ξ^,μ,μ^)L(w,b,\alpha ,\hat{\alpha },\xi ,\hat{\xi },\mu ,\hat{\mu })wwbbξiξ_iξi^\hat{ξ_i } 的偏导为零可得:
    在这里插入图片描述
    上述过程中需满足KKT条件,即要求:
    在这里插入图片描述
    SVR的解形如
    在这里插入图片描述
    能使式中的(αi^αi)0(\hat{\alpha_i}-α_i )\neq 0的样本即为SVR的支持向量,它付必落在ϵ-同隔带之外.显然, SVR的支持向量仅是训练样本的一部分,即其解仍具有稀疏性.

    0&lt;αi&lt;C0&lt;α_i&lt;C,则必有ξi=0ξ_i=0
    在这里插入图片描述
    实践中常采用一中更鲁棒的办法:迭取多个满足条件0&lt;αi&lt;C0&lt;α_i&lt;C的样本求解b后取平均値。

    若考虑特征映射形式,则:
    在这里插入图片描述
    则SVR可表示为:
    在这里插入图片描述
    其中K(xiTx)=(xi)T(xj)K(x_i^T x)=∅(x_i )^T∅(x_j )为核函数。

    展开全文
  • 支持向量机SVM

    千次阅读 2015-04-09 21:08:13
    支持向量机SVM(Support Vector Machine),是机器学习领域的一个有监督的学习模型。

    支持向量机SVM(Support Vector Machine),是机器学习领域的一个有监督的学习模型。

    一、简介

    支持向量机建立在统计学习理论的基础之上。统计学习理论(Statistical learning Theory简称SLT)是一种处理小样本的统计理论.

    为研究有限样本情况下的统计模式识别和更广泛的机器学习问题建立了一个较好的理论框架.同时发展了一种新的模式识别方法一支

    持向量机(support Vector Machine,简称SVM),能较好地解决小样本学习问题。支持向量机(SVM)是一种的分类方法.假定样本数

    据服从某个分布。根据统计学习理论.要使分类函数的实际输出与理想输出之间的偏差尽可能小。应遵循结构风险最小化原理.而不

    是传统的经验风险最小化原理,SVM正是这一理论的具体实现。

    二、支持向量机(SVM)

    1,最优分类面


    SVM方法是从线性可分情况下提出的。考虑如图1所示的二维两类线性可分情况.图中实心点和空心点分别表示两类训练样本。

    H为把两类数据没有错误地分开的最优分类线,H1,H2分别为过两类样本中离分类超平面最近的点且平行于分类线.H1和H2之间

    的距离叫做间距(m越咖)。如果该分类线将两类数据没有错误的分开且最近的点与分类线问的距离最大.则这样的分类线称为最优分

    类线(在多维空间成为最优超平面)。可以看到最优分类超平面所要求的第一个条件.是将两类数据无错误的分开。即保证经验风险最

    小;第二个条件是使分类间距最大.即使推广能力的界的置信区间最小.从而使真实风险最小。



    2,广义最优分类面

    3,支持向量机

    SVM的机理是寻找一个满足分类要求的最优分类超平面,使得该超平面在保证分类精度的同时,能够使超平面两侧的空白区

    域最大化。理论上,支持向量机能够实现对线性可分数据的最优分类。

    支持向量机在线性可分或几乎线性可分时.直接在原始空同中建立超平面作为分类面。然而实际应用中的大多数问题都是复杂

    的、非线性的。这时就必须寻求复杂的超曲面作为分界面。支持向量机通过在另一个高维空间中运用处理线性问题的方法建立一个

    分类超平面.从而隐含在原始空问建立一个超曲面。支持向量机方法避开了高维空闻的计算,并不显式地进行变换计算.而只做训

    练样本之间的内积运算。这种内积运算由事先定义的核函数来实现。将线性空间中的非线性问题映射为非线性空间中的线性问题,

    从而从根本上解决非线性问题。

    三、学习总结

    本周从图书馆检索到相关期刊、论文,看到很多论文是把该算法结合具体问题应用的,考虑到自己初学只从期刊上下载了8篇,

    其中有3篇比较合适我阅读。细读了一篇2007年发表的,浏览了其他两篇的前半部分,其中用到相关的数学模型大致相同。有相关

    数学模型和公式的地方按照作者的思路来是可以看懂一点,但是我不知道为什么要那么做,用那种方法有什么好处不能理解。

    展开全文
  • 7种支持向量机SVM工具包

    热门讨论 2011-11-13 09:39:43
    7种支持向量机SVM工具包:LIBSVM(台湾大学林智仁,详细说明可查看其主页)、Mysvm(作者:stefan ruping)、SVMlight(作者:Thorsten Joachims)、LS_SVM、OSU_SVM、Stprtool、SVM_SteveGunn.后面四个,海军工程...
  • python机器学习库sklearn——支持向量机svm

    万次阅读 多人点赞 2018-04-03 22:04:12
    支持向量机svm的相关的知识内容可以参考 https://blog.csdn.net/luanpeng825485697/article/details/78823919 支持向量机的优势在于: 在高维空间中非常高效.即使在数据维度比样本数量大的情况下仍然有效. 在决策...

    分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开


    全栈工程师开发手册 (作者:栾鹏)
    python数据挖掘系列教程

    支持向量机svm的相关的知识内容可以参考
    https://blog.csdn.net/luanpeng825485697/article/details/78823919

    支持向量机的优势在于:

    • 在高维空间中非常高效.即使在数据维度比样本数量大的情况下仍然有效.
    • 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
    • 通用性: 不同的核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.

    支持向量机的缺点包括:

    • 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化项是非常重要的.
    • 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的. (详情见 Scores and probabilities, 在下文中).

    sklearn.svm模块提供了很多模型供我们使用。

    这里写图片描述

    SVC

    **SVC用于分类:**支持向量分类,基于libsvm实现的,数据拟合的时间复杂度是数据样本的二次方,这使得他很难扩展到10000个数据集,当输入是多类别时(SVM最初是处理二分类问题的),通过一对一的方案解决,当然也有别的解决办法。

    SVC参数说明如下:

    C:惩罚项,float类型,可选参数,默认为1.0,C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。

    kernel:核函数类型,str类型,默认为’rbf’。可选参数为:

    • ‘linear’:线性核函数
    • ‘poly’:多项式核函数
    • ‘rbf’:径像核函数/高斯核
    • ‘sigmod’:sigmod核函数
    • ‘precomputed’:核矩阵。precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,核矩阵需要为n*n的。

    degree:多项式核函数的阶数,int类型,可选参数,默认为3。这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。

    gamma:核函数系数,float类型,可选参数,默认为auto。只对’rbf’ ,’poly’ ,’sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
    coef0:核函数中的独立项,float类型,可选参数,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c。

    probability:是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢。

    shrinking:是否采用启发式收缩方式,bool类型,可选参数,默认为True。

    tol:svm停止训练的误差精度,float类型,可选参数,默认为1e^-3。

    cache_size:内存大小,float类型,可选参数,默认为200。指定训练所需要的内存,以MB为单位,默认为200MB。

    class_weight:类别权重,dict类型或str类型,可选参数,默认为None。给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数’balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。

    verbose:是否启用详细输出,bool类型,默认为False,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。

    max_iter:最大迭代次数,int类型,默认为-1,表示不限制。

    decision_function_shape:决策函数类型,可选参数’ovo’和’ovr’,默认为’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。

    random_state:数据洗牌时的种子值,int类型,可选参数,默认为None。伪随机数发生器的种子,在混洗数据时用于概率估计。

    NuSVC

    **NuSVC(Nu-Support Vector Classification.):**核支持向量分类,和SVC类似,也是基于libsvm实现的,但不同的是通过一个参数空值支持向量的个数。

    • nu:训练误差的一个上界和支持向量的分数的下界。应在间隔(0,1 ]。
    • 其余同SVC

    LinearSVC

    **LinearSVC(Linear Support Vector Classification):**线性支持向量分类,类似于SVC,但是其使用的核函数是”linear“上边介绍的两种是按照brf(径向基函数计算的,其实现也不是基于LIBSVM,所以它具有更大的灵活性在选择处罚和损失函数时,而且可以适应更大的数据集,他支持密集和稀疏的输入是通过一对一的方式解决的。

    LinearSVC 参数解释

    **C:**目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
    **loss:**指定损失函数
    penalty :
    **dual :**选择算法来解决对偶或原始优化问题。当nsamples>nfeaturesn_{samples} > n_{features} 时dual=false。
    tol :(default = 1e - 3): svm结束标准的精度;
    **multi_class:**如果y输出类别包含多类,用来确定多类策略, ovr表示一对多,“crammer_singer”优化所有类别的一个共同的目标 。如果选择“crammer_singer”,损失、惩罚和优化将会被被忽略。
    fit_intercept :
    intercept_scaling :
    **class_weight :**对于每一个类别i设置惩罚系数C=classweight[i]CC = class_{weight}[i]*C,如果不给出,权重自动调整为 $n_{samples} / (n_{classes} * np.bincount(y)) $
    **verbose:**跟多线程有关,不大明白啥意思具体。

    编写代码

    数据集下载地址:https://github.com/626626cdllp/sklearn/blob/master/SVM_data.txt

    SVC、LinearSVC、NuSVC

    
    import numpy as np # 快速操作结构数组的工具
    from sklearn import svm  # svm支持向量机
    import matplotlib.pyplot as plt # 可视化绘图
    
    
    data_set = np.loadtxt("SVM_data.txt")
    train_data = data_set[:,0:2]   # 训练特征空间
    train_target = np.sign(data_set[:,2])  # 训练集类标号
    
    test_data = [[3,-1], [1,1], [7,-3], [9,0]] # 测试特征空间
    test_target = [-1, -1, 1, 1]  # 测试集类标号
    
    plt.scatter(data_set[:,0],data_set[:,1],c=data_set[:,2])  # 绘制可视化图
    plt.show()
    
    # 创建模型
    clf = svm.SVC()
    clf.fit(X=train_data, y=train_target,sample_weight=None)  # 训练模型。参数sample_weight为每个样本设置权重。应对非均衡问题
    result = clf.predict(test_data)  # 使用模型预测值
    print('预测结果:',result)  # 输出预测值[-1. -1.  1.  1.]
    
    # 获得支持向量
    print('支持向量:',clf.support_vectors_)
    # 获得支持向量的索引
    print('支持向量索引:',clf.support_)
    # 为每一个类别获得支持向量的数量
    print('支持向量数量:',clf.n_support_)
    
    
    # # ===============================Linear SVM======================
    from sklearn.svm import LinearSVC
    
    clf = LinearSVC() # 创建线性可分svm模型,参数均使用默认值
    clf.fit(train_data, train_target)  # 训练模型
    result = clf.predict(test_data)  # 使用模型预测值
    print('预测结果:',result)  # 输出预测值[-1. -1.  1.  1.]
    
    
    # # ===============================Linear NuSVC======================
    from sklearn.svm import NuSVC
    
    clf = NuSVC() # 创建线性可分svm模型,参数均使用默认值
    clf.fit(train_data, train_target)  # 训练模型
    result = clf.predict(test_data)  # 使用模型预测值
    print('预测结果:',result)  # 输出预测值[-1. -1.  1.  1.]
    

    不均衡样本、多分类问题

    现在我们再来模拟一下样本不均衡的情况,同时学习下SVM处理多分类问题。

    # ===============================样本不平衡、多分类的情况========================
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm
    
    # 创建不均衡样本
    rng = np.random.RandomState(0)
    n_samples_1 = 1000
    n_samples_2 = 100
    n_samples_3 = 100
    X = np.r_[1.5 * rng.randn(n_samples_1, 2), 0.5 * rng.randn(n_samples_2, 2) + [2, 2],0.5 * rng.randn(n_samples_3, 2) + [-3, 3]]  # 三类样本点中心为(1.5,1.5)、(2,2)、(-3,3)
    y = [0] * (n_samples_1) + [1] * (n_samples_2)+ [2] * (n_samples_3)  # 前面的1000个为类别0,后面的100个为类别1,最后100个类别为2
    
    # 创建模型获取分离超平面
    clf = svm.SVC(decision_function_shape='ovo',kernel='linear', C=1.0)  # decision_function_shape='ovo'为使用1对1多分类处理。会创建n(n-1)/2个二分类。ovr为一对所有的处理方式
    clf.fit(X, y)
    
    # 多分类的情况下,获取其中二分类器的个数。
    dec = clf.decision_function([[1.5,1.5]])  # decision_function()的功能:计算样本点到分割超平面的函数距离。 包含几个2分类器,就有几个函数距离。
    print('二分类器个数:',dec.shape[1])
    
    # 绘制,第一个二分类器的分割超平面
    w = clf.coef_[0]
    a = -w[0] / w[1]  # a可以理解为斜率
    xx = np.linspace(-5, 5)
    yy = a * xx - clf.intercept_[0] / w[1]  # 二维坐标下的直线方程
    
    # 使用类权重,获取分割超平面
    wclf = svm.SVC(kernel='linear', class_weight={1: 10})
    wclf.fit(X, y)
    
    
    # 绘制 分割分割超平面
    ww = wclf.coef_[0]
    wa = -ww[0] / ww[1]
    wyy = wa * xx - wclf.intercept_[0] / ww[1]  # 带权重的直线
    
    # 绘制第一个二分类器的分割超平面和样本点
    h0 = plt.plot(xx, yy, 'k-', label='no weights')
    h1 = plt.plot(xx, wyy, 'k--', label='with weights')
    plt.scatter(X[:, 0], X[:, 1], c=y)
    plt.legend()
    
    plt.show()
    

    这里写图片描述
    回归

    支持向量分类的方法可以被扩展用作解决回归问题. 这个方法被称作支持向量回归.

    支持向量分类生成的模型(如前描述)只依赖于训练集的子集,因为构建模型的 cost function 不在乎边缘之外的训练点. 类似的,支持向量回归生成的模型只依赖于训练集的子集, 因为构建模型的 cost function 忽略任何接近于模型预测的训练数据.

    支持向量分类有三种不同的实现形式: SVR, NuSVR 和 LinearSVR. 在只考虑线性核的情况下, LinearSVR 比 SVR 提供一个更快的实现形式, 然而比起 SVR 和 LinearSVR, NuSVR 实现一个稍微不同的构思(formulation)

    与分类的类别一样, fit方法会调用参数向量 X, y, 只在 y 是浮点数而不是整数型.:

    # ===============================SVM回归预测========================
    X = [[0, 0], [2, 2]]
    y = [0.5, 2.5]
    clf = svm.SVR()
    clf.fit(X, y)
    clf.predict([[1, 1]])
    

    使用诀窍

    • 避免数据复制: 对于 SVC, SVR, NuSVC 和 NuSVR, 如果数据是通过某些方法而不是用 C 有序的连续双精度,那它先会调用底层的 C 命令再复制。 您可以通过检查它的 flags 属性,来确定给定的 numpy 数组是不是 C 连续的。

    • 对于 LinearSVC (和 LogisticRegression) 的任何输入,都会以 numpy 数组形式,被复制和转换为 用 liblinear 内部稀疏数据去表达(双精度浮点型 float 和非零部分的 int32 索引)。 如果您想要一个适合大规模的线性分类器,又不打算复制一个密集的 C-contiguous 双精度 numpy 数组作为输入, 那我们建议您去使用 SGDClassifier 类作为替代。目标函数可以配置为和 LinearSVC 模型差不多相同的。

    • 内核的缓存大小: 在大规模问题上,对于 SVC, SVR, nuSVC 和 NuSVR, 内核缓存的大小会特别影响到运行时间。如果您有足够可用的 RAM,不妨把它的 缓存大小 设得比默认的 200(MB) 要高,例如为 500(MB) 或者 1000(MB)。

    • 惩罚系数C的设置:在合理的情况下, C 的默认选择为 1 。如果您有很多混杂的观察数据, 您应该要去调小它。 C 越小,就能更好地去正规化估计。

    • 支持向量机算法本身不是用来扩大不变性,所以 我们强烈建议您去扩大数据量. 举个例子,对于输入向量 X, 规整它的每个数值范围为 [0, 1] 或 [-1, +1] ,或者标准化它的为均值为0方差为1的数据分布。请注意, 相同的缩放标准必须要应用到所有的测试向量,从而获得有意义的结果。 请参考章节 预处理数据 ,那里会提供到更多关于缩放和规整。

    • 在 NuSVC/OneClassSVM/NuSVR 内的参数 nu , 近似是训练误差和支持向量的比值。

    • 在 SVC, ,如果分类器的数据不均衡(就是说,很多正例很少负例),设置 class_weight=‘balanced’ 与/或尝试不同的惩罚系数 C 。

    • 在拟合模型时,底层 LinearSVC 操作使用了随机数生成器去选择特征。 所以不要感到意外,对于相同的数据输入,也会略有不同的输出结果。如果这个发生了, 尝试用更小的 tol 参数。

    • 使用由 LinearSVC(loss=‘l2’, penalty=‘l1’, dual=False) 提供的 L1 惩罚去产生稀疏解,也就是说,特征权重的子集不同于零,这样做有助于决策函数。 随着增加 C 会产生一个更复杂的模型(要做更多的特征选择)。可以使用 l1_min_c 去计算 C 的数值,去产生一个”null” 模型(所有的权重等于零)。

    展开全文
  • 基于支持向量机SVM的文本分类的实现

    万次阅读 多人点赞 2017-01-16 09:49:24
    SVM 文本分类算法主要分四个步骤:文本特征提取、文本特征表示、归一化处理和文本分类。

     

    基于支持向量机SVM的文本分类的实现

    1 SVM简介

     

    支持向量机(SVM)算法被认为是文本分类中效果较为优秀的一种方法,它是一种建立在统计学习理论基础上的机器学习方法。该算法基于结构风险最小化原理,将数据集合压缩到支持向量集合,学习得到分类决策函数。这种技术解决了以往需要无穷大样本数量的问题,它只需要将一定数量的文本通过计算抽象成向量化的训练文本数据,提高了分类的精确率。

     

    支持向量机(SVM)算法是根据有限的样本信息,在模型的复杂性与学习能力之间寻求最佳折中,以求获得最好的推广能力支持向量机算法的主要优点有:

     

    (1)专门针对有限样本情况,其目标是得到现有信息下的最优解而不仅仅是样本数量趋于无穷大时的最优值;

     

    (2)算法最终转化为一个二次型寻优问题,理论上得到的是全局最优点,解决了在神经网络方法中无法避免的局部极值问题;

     

    (3)支持向量机算法能同时适用于稠密特征矢量与稀疏特征矢量两种情况,而其他一些文本分类算法不能同时满足两种情况。

     

    (4)支持向量机算法能够找出包含重要分类信息的支持向量,是强有力的增量学习和主动学习工具,在文本分类中具有很大的应用潜力。

     

    2 基于SVM的文本分类过程 

     

    SVM 文本分类算法主要分四个步骤:文本特征提取、文本特征表示、归一化处理和文本分类。

     

    2.1文本特征提取

     

    目前,在对文本特征进行提取时,常采用特征独立性假设来简化特征选择的过程,达到计算时间和计算质量之间的折中。一般的方法是根据文本中词汇的特征向量,通过设置特征阀值的办法选择最佳特征作为文本特征子集,建立特征模型。(特征提取前,先分词,去停用词)。

     

      本特征提取有很多方法,其中最常用的方法是通过词频选择特征。先通过词频计算出权重,按权重从大到小排序,然后剔除无用词,这些词通常是与主题无关的,任何类的文章中都有可能大量出现的,比如“的”“是”“在”一类的词,一般在停词表中已定义好,去除这些词以后,有一个新的序列排下来,然后可以按照实际需求选取权重最高的前8个,10个或者更多词汇来代表该文本的核心内容。 

     

    综上所述,特征项的提取步骤可以总结为:

     

      (1)对全部训练文档进行分词,由这些词作为向量的维数来表示文本;

     

      (2)统计每一类内文档所有出现的词语及其频率,然后过滤,剔除停用词和单字词;

      (3)统计每一类内出现词语的总词频,并取其中的若干个频率最高的词汇作为这一类别的特征词集;


    (4)去除每一类别中都出现的词,合并所有类别的特征词集,形成总特征词集。最后所得到的特征词集就是我们用到的特征集合,再用该集合去筛选测试集中的特征。

     

     

    2.2文本特征表示

    TF-IDF 公式来计算词的权值:

     

     

    其中tfik表示特诊次tk在文档di中出现的频率,N为训练文档总数,nk为在训练集中出现词tk的文档数。由TF-IDF公式,一批文档中某词出现的频率越高,它的区分度则越小,权值也越低;而在一个文档中,某词出现的频率越高,区分度则越大,权重越大。

     

    2.3归一化处理

    归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

     

     

    公式中a为关键词的词频,min为该词在所有文本中的最小词频,max为该词在所有文本中的最大词频。这一步就是归一化,当用词频进行比较时,容易发生较大的偏差,归一化能使文本分类更加精确。

     

    2.4文本分类

    经过文本预处理、特征提取、特征表示、归一化处理后,已经把原来的文本信息抽象成一个向量化的样本集,然后把此样本集与训练好的模板文件进行相似度计算,若不属于该类别,则与其他类别的模板文件进行计算,直到分进相应的类别,这就是SVM 模型的文本分类方式。 

     

    基于SVM的系统实现(如图所示)

    本实验采用libsvm工具包进行svm的分类,具体过程可参考使用libsvm实现文本分类

     

    展开全文
  • 支持向量机SVM分析

    万次阅读 2013-07-06 18:27:08
    1995年Vapnik等人[2]提出一种机器学习的新方法支持向量机(Support Vector Machine,SVM)之后,支持向量机成为继人工神经网络之后又一研究热点。SVM 算法的核心在于最优分类超平面的确定,即通过训练样本确定分类器...
  • 支持向量机SVM整理

    千次阅读 2015-01-12 16:47:52
    支持向量机在解决小样本、非线性及高维模式识别问题中表现出了许多特有的优势,针对多类分类问题的经典SVM 算法主要有一对一方法(1-vs-1),一对多方法(1-vs-all.线性可分问题SVM 是从线性可分情况下的最优分类面发展...
  • MATLAB支持向量机SVM代码实现

    万次阅读 多人点赞 2014-06-30 10:59:26
    本栏目(Machine learning)包括单参数的线性回归、多参数的线性回归、Octave Tutorial、Logistic ... 支持向量机)、聚类、降维、异常检测、大规模机器学习等章节。所有内容均来自Standford公开课machine learning
  • python 支持向量机SVM实例解析

    千次阅读 2017-12-28 20:52:22
    import numpy as npy from sklearn import svm import matplotlib.pyplot as plt'''加载数据''' x1 = [] y1 = [] for i in range(0, 10): if (i <= 3 or i >= 8): x1.append([i, i]) y1.append(0)
  • SVM在解决小样本、非线性及高维模式识别问题中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中 目标 找到一个超平面,使得它能够尽可能多的将两类数据点正确的分开,同时使分开的两类数据点距离...
  • 支持向量机SVM算法原理及应用(R)

    万次阅读 2016-08-17 16:37:25
    在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。SVM涉及的知识面非常广,目标函数、优化过程、并行方法、算法收敛性、样本复杂度等。...
  • 支持向量机SVM的MATLAB实现

    万次阅读 2017-11-16 15:23:22
    1.支持向量机Support Vector Machine,SVM。1.1分类思想以结构化风险最小为原则,兼顾训练误差与测试误差的最小化。2.svm2.1线性;2.2非线性CSVM;2.3核函数的SVM:非线性映射(把低维映射到高维;采用核函数来实现...
  • 支持向量机SVM核函数分析

    千次阅读 2013-07-13 06:09:13
    将核函数形式化定义。如果原始特征内积是,映射后为,那么定义核函数(Kernel)为。因些,我们可以得出结论,如果要实现该节开头的效果,只需先计算,然后计算即可,然而这种计算方式是非常低效的。
  • Stanford机器学习---第八讲. 支持向量机SVM

    万次阅读 多人点赞 2012-08-12 16:55:10
    本栏目(Machine learning)包括单参数的线性回归、多参数的线性回归、Octave Tutorial、Logistic Regression、Regularization、神经网络、机器学习系统设计、SVM(Support Vector Machines 支持向量机)、聚类、...
  • 支持向量机SVM通俗理解(python代码实现)

    万次阅读 多人点赞 2017-05-11 02:42:08
    这是第三次来“复习”SVM了,第一次是使用SVM包,调用包并尝试调节参数。听闻了“流弊”SVM的算法。第二次学习理论,看了李航的《统计学习方法》以及网上的博客。看完后感觉,满满的公式。。。记不住啊。第三次,也...
  • 支持向量机SVM核函数的选择(七)

    万次阅读 2016-04-04 10:05:08
    支持向量机是建立在统计学习理论基础之上的新一代机器学习算法,支持向量机的优势主要体现在解决线性不可分问题,它通过引入核函数,巧妙地解决了在高维空间中的内积运算,从而很好地解决了非线性分类问题。...
  • 支持向量机SVM原理篇

    万次阅读 2016-06-15 10:17:09
    1.关键概念及学习目标 线性&非线性分类问题&核技巧 ...核技巧应用到支持向量机,其基本想法就是通过一个非线性变换将输入空间(欧氏空间或离散集合)对应于一个特征空间(希尔伯特空间),使得原有的超曲
  • 【机器学习】python使用支持向量机SVM

    万次阅读 多人点赞 2018-05-30 18:22:14
    【机器学习】python使用支持向量机SVM准备: 数据集 导入SVM模块步骤: 1.读取数据集 2.划分训练样本与测试样本 3.训练SVM分类器 4.计算分类准确率 5.绘制图像 关于SVM的原理知识,在【机器学习】支持向量机...
  • 支持向量机SVM总结

    千次阅读 2018-10-18 10:41:59
    支持向量机SVM(Support Vector Machine) 概念介绍 一个有监督的学习模型,通常用来进行模式识别、分类、回归分析等。 SVM在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的...
  • 关于支持向量机SVM

    2019-03-15 20:49:55
    SVM的全称是Support Vector Machine,即支持向量机,主要用于解决模式识别领域中的数据分类问题,属于有监督学习算法的一种。无论是Matlab的SVM工具箱,LIBSVM还是python框架下的SciKit Learn都可以提供方便快捷的...
  • 支持向量机SVM简介

    2014-09-15 22:13:31
    支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类...
  • 支持向量机SVM和核函数的matlab程序代码--完整,调试过的有效的程序
  • 一、问题和超平面描述 给定训练集 分类学习最基本的想法就是基于训练集在样本空间中找到一个划分超平面,将不同类别的样本分开,但能将训练样本分开的划分超平面可能有很多,如下图所示: ...
  • python利用支持向量机SVM进行时间序列预测, 包括数据和python代码 python利用支持向量机SVM进行时间序列预测, 包括数据和python代码
  • 支持向量机SVM 参数选择

    千次阅读 2017-09-17 15:01:00
    支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分类...

空空如也

1 2 3 4 5 ... 20
收藏数 40,113
精华内容 16,045
关键字:

支持向量机