svr算法和svm算法哪个好

Posted

tags:

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

1、支持向量机( SVM )是一种比较好的实现了结构风险最小化思想的方法。它的机器学习策略是结构风险最小化原则
为了最小化期望风险,应同时最小化经验风险和置信范围)

支持向量机方法的基本思想:

( 1
)它是专门针对有限样本情况的学习机器,实现的是结构风险最小化:在对给定的数据逼近的精度与逼近函数的复杂性之间寻求折衷,以期获得最好的推广能力;

( 2
)它最终解决的是一个凸二次规划问题,从理论上说,得到的将是全局最优解,解决了在神经网络方法中无法避免的局部极值问题;

( 3
)它将实际问题通过非线性变换转换到高维的特征空间,在高维空间中构造线性决策函数来实现原空间中的非线性决策函数,巧妙地解决了维数问题,并保证了有较好的推广能力,而且算法复杂度与样本维数无关。

目前, SVM
算法在模式识别、回归估计、概率密度函数估计等方面都有应用,且算法在效率与精度上已经超过传统的学习算法或与之不相上下。

对于经验风险R,可以采用不同的损失函数来描述,如e不敏感函数、Quadratic函数、Huber函数、Laplace函数等。

核函数一般有多项式核、高斯径向基核、指数径向基核、多隐层感知核、傅立叶级数核、样条核、 B
样条核等,虽然一些实验表明在分类中不同的核函数能够产生几乎同样的结果,但在回归中,不同的核函数往往对拟合结果有较大的影响

2、支持向量回归算法(svr)主要是通过升维后,在高维空间中构造线性决策函数来实现线性回归,用e不敏感函数时,其基础主要是 e
不敏感函数和核函数算法。

若将拟合的数学模型表达多维空间的某一曲线,则根据e 不敏感函数所得的结果,就是包括该曲线和训练点的“
e管道”。在所有样本点中,只有分布在“管壁”上的那一部分样本点决定管道的位置。这一部分训练样本称为“支持向量”。为适应训练样本集的非线性,传统的拟合方法通常是在线性方程后面加高阶项。此法诚然有效,但由此增加的可调参数未免增加了过拟合的风险。支持向量回归算法采用核函数解决这一矛盾。用核函数代替线性方程中的线性项可以使原来的线性算法“非线性化”,即能做非线性回归。与此同时,引进核函数达到了“升维”的目的,而增加的可调参数是过拟合依然能控制。
参考技术A svr是svm的一种应用,svm包括svc和svr,svr是回归,svc是分类

机器学习从SVM到SVR

:最近在工作中,高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR。另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费了不少时间。因此在这里做个总结,比较一下使用同一个模型做分类和回归之间的差别,也纪念一下与SVM相遇的两周年!这篇总结,不会涉及太多公式,只是希望通过可视化的方法对SVM有一个比较直观的认识。

由于代码比较多,没有放到正文中,所有代码都可以在github中:link

 

0. 支持向量机(support vector machine, SVM)


原始SVM算法是由弗拉基米尔·万普尼克和亚历克塞·泽范兰杰斯于1963年发明的。1992年,Bernhard E. Boser、Isabelle M. Guyon和弗拉基米尔·万普尼克提出了一种通过将核技巧应用于最大间隔超平面来创建非线性分类器的方法。当前标准的前身(软间隔)由Corinna Cortes和Vapnik于1993年提出,并于1995年发表。

上个世纪90年代,由于人工神经网络(RNN)的衰落,SVM在很长一段时间里都是当时的明星算法。被认为是一种理论优美且非常实用的机器学习算法。

在理论方面,SVM算法涉及到了非常多的概念:间隔(margin)、支持向量(support vector)、核函数(kernel)、对偶(duality)、凸优化等。有些概念理解起来比较困难,例如kernel trick和对偶问题。在应用方法,SVM除了可以当做有监督的分类和回归模型来使用外,还可以用在无监督的聚类及异常检测。相对于现在比较流行的深度学习(适用于解决大规模非线性问题),SVM非常擅长解决复杂的具有中小规模训练集的非线性问题,甚至在特征多于训练样本时也能有非常好的表现(深度学习此时容易过拟合)。但是随着样本量$m$的增加,SVM模型的计算复杂度会呈$m^2$或$m^3$增加。

在下面的例子中,均使用上一篇博客中提到的鸢尾属植物数据集

Iris_data_set

图1:Iris data set

 

1. SVM的前身:感知机(Perceptron)


感知机可以看做是低配版的线性SVM,从数学上可以证明:

在线性可分的两类数据中,感知机可以在有限步骤中计算出一条直线(或超平面)将这两类完全分开。

如果这两类距离越近,所需的步骤就越多。此时,感知机只保证给出一个解,但是解不唯一,如下图所示:

 

 图2:感知机训练出来的3个不同的线性分类器

 

1.1 对二分类问题的具体描述

训练样本$x \\in \\mathbb{ R }^{n}$,标签$y \\in {-1, 1}$,对于线性分类器来说:

  • 参数: $w \\in \\mathbb{ R }^n$ and $b \\in \\mathbb{ R }$
  • 决策边界(Decision boundary):$w \\cdot x + b = 0$
  • 对于一个新的点$x$做分类时,预测标签为$sign(w \\cdot x + b)$

参考上面的描述,在分类正确的情况下,如果一个点$x$的标签为$y = 1$,预测值$w \\cdot x + b > 0$,分类为1;标签为-1,预测值小于0,分类为-1. 那么可以使用$y (w \\cdot x + b) > 0 $来统一表示分类正确的情况,反之可以使用$y(w \\cdot x + b) < 0$来表示分类错误的情况。

 

1.2 代价函数

在分类正确时,即$y (w \\cdot x + b) > 0$,$loss = 0$;

在分类错误时,即$y (w \\cdot x + b) \\leq 0$,$loss = -y (w \\cdot x + b)$.

 

1.3 算法的流程

利用随机梯度下降的方式训练模型,每次只使用一个样本,根据代价函数的梯度更新参数,

step1: 初始化$w = 0, b = 0$;

step2: 循环从训练集取样本,每次一个

           if $y (w \\cdot x + b) \\leq 0$(该样本分类错误):

               w = w + yx

               b = b + y

从流程上来看,每次取出一个样本点训练模型,而且只在分错的情况下更新参数,最终所有样本都分类正确时,模型训练过程结束。

 

2. SVM - 线性可分


在两类样本线性可分的情况下,感知机可以保证找到一个解,完全正确的区分这两类样本。但是解不唯一,而且这些决策边界的质量也不相同,直观上来看这条线两边的间隔越大越好。那么有没有一种方法可以直接找到这个最优解呢?这就是线性SVM所做的事情。

从直观上来看,约束条件越多对模型的限制也就越大,因此解的个数也就越少。感知机的解不唯一,那么给感知机的代价函数加上更强的约束条件好像就可以减少解的个数。事实上也是这样的。

2.1 SVM的代价函数

在分类正确时,即$y (w \\cdot x + b) > 1$,$loss = 0$;

在分类错误时,即$y (w \\cdot x + b) \\leq 1$,$loss = -y (w \\cdot x + b)$.

比较一下可以发现,原来$w \\cdot x + b$只需要大于0或小于0就可以了,但是现在需要大于1或小于1. 在这里为什么选择1我还没有很直观的解释,但是有一点非常重要:原来的决策边界只是一条直线,现在则变成了一条有宽度的条带。原来差异非常小的两个点(例如$w \\cdot x + b = 0$附近的两个点)就可以被分成不同的两类,但是现在至少要相差$\\frac{2}{||w||}$才可以,如下图所示。

图3:设样本属于两个类,用该样本训练SVM得到的最大间隔超平面。在超平面上的样本点也称为支持向量。

2.2 决策边界以及间隔

图3来自wiki,为了统一起见,下面还是将决策边界定义为$w \\cdot x + b = 0$,两边的边界(两条虚线)分别为$w \\cdot x + b = 1$和$w \\cdot x + b = -1$,此时只是b的符号不同其他性质都相同. 其中$w, b$就是模型训练时需要优化的参数。由上面的示意图可以得到以下信息:

  • 两条虚线之间的距离为$\\frac{2}{||w||}$;
  • 待优化参数$w$的方向就是决策边界的法向量方向($w$与决策边界垂直);
  • 此时边界上一共有3个点,这三个点也就是此时的支持向量。

下面是计算两条虚线之间距离的过程:

将决策边界的向量表示$w·x + b = 0$展开后可以得到,$w1*x1 + w2*x2 + b = 0$.

转化成截距式可以得到,$x2 = - w1/w2 * x1 - b/w2$,因此其斜率为$-w1/w2$, 截距为$-b/w2$

直线的方向向量为,$(1, -w1/w2)$(可以取x=1, b=0时,得到y的值)

直线的法向量为$w = (w1, w2)$

因此,对于直线$w \\cdot x + b = 1$来说,截距式为$x2 = - w1/w2 * x1 + (1 - b)/w2$,相当于沿着$x2$轴向上平移了$\\frac{1}{w_2}$,计算可得该直线与$w \\cdot x + b = 0$沿法向量方向的距离为$\\gamma = \\sqrt{\\frac{1}{w_1^2 + w_2^2}} = \\frac{1}{||w||}$,参考图4.

图4:margin的宽度$\\gamma$

2.3 优化目标

在SVM中,优化的目标就是最大化margin的宽度$\\gamma$,因为$\\gamma = \\frac{1}{||w||}$,其中$||w||$是待优化参数$w$的模长。因此优化目标等价于最小化$||w||$,可以表示为为:

对于$(x^{(1)}, y^{(1)}), \\ ..., \\ (x^{(m)}, y^{(m)}) \\in \\mathbb{R^d} \\times \\{-1, 1\\}$,$\\min_{w \\in \\mathbb{R}^d, b \\in \\mathbb{R}}||w||^2$

s.t. $y^{(i)}(w \\cdot x^{(i)} + b) ≥ 1$对于所有的$i = 1, 2, ..., m$成立

 

下面是分别使用感知机和SVM对鸢尾属数据集中setosa这一类和非setosa进行分类的效果比较:

图5:感知机线性分类器

 

图6:线性SVM的分类效果

比较图5和图6可以看到,SVM确定的决策边界周围的margin更大一些,因此对更多未知的样本进行分类时,在边界上的一些点可以得到更准确的分类结果。

 

3. SVM - 线性不可分


在图1中可以看到,setosa这一类与其他两类是线性可分的,但是virginica这一类与与之相邻的versicolor有一些点是重合的,也就是说是线性不可分的。此时仍然可以使用SVM来进行分类,原理是在代价函数中加入了一个松弛变量(slack) $\\xi$,

对于$(x^{(1)}, y^{(1)}), \\ ..., \\ (x^{(m)}, y^{(m)}) \\in \\mathbb{R^d} \\times \\{-1, 1\\}$,$\\min_{w \\in \\mathbb{R}^d, b \\in \\mathbb{R}}||w||^2 + C\\sum_{i=1}^{m}{\\xi^i} $

s.t. $y^{(i)}(w \\cdot x^{(i)} + b) ≥ 1 - \\xi_i$对于所有的$i = 1, 2, ..., m$成立

上面的优化目标加入松弛变量后,就可以允许一定程度的违反两边的边界(由上式中的C来控制),允许一定的错误分类,从而将两类原来线性不可分的两类数据分开。

下面是$C=1000$时,对virginica和非virginica的分类效果:

图8:加入松弛变量后的SVM分类效果

C作为SVM模型的超参数之一,需要从一个较大的范围中一步一步的筛选,直到找到最适合的C。C值越大,表示错误分类的代价越大,就越趋于拒绝错误分类,即hard margin;C值越小,表示错误分类的代价越小,就越能容忍错误分类,即soft margin。即使是在线性可分的情况下,如果C设置的非常小,也可能导致错误分类的出现;在线性不可分的情况下,设置过大的C值会导致训练无法收敛。

 

4. SVR - 利用SVM做回归分析


支持向量回归模型(Support Vector Regression, SVR)是使用SVM来拟合曲线,做回归分析。分类和回归问题是有监督机器学习中最重要的两类任务。与分类的输出是有限个离散的值(例如上面的$\\{-1, 1\\}$)不同的是,回归模型的输出在一定范围内是连续的。下面不再考虑不同鸢尾花的类型,而是使用花瓣的长度(相当于自变量x)来预测花瓣的宽度(相当于因变量y)。

下图中从所有150个样本中,随机取出了80%作为训练集:

图9:训练SVR模型的训练样本

下面是使用线性SVR训练出来的回归线:

图10:SVR模型训练出来的回归线

与SVM是使用一个条带来进行分类一样,SVR也是使用一个条带来拟合数据。这个条带的宽度可以自己设置,利用参数$\\epsilon$来控制:

图11:SVR模型回归效果示意图,其中带红色环的点表示支持向量

在SVM模型中边界上的点以及两条边界内部违反margin的点被当做支持向量,并且在后续的预测中起作用;在SVR模型中边界上的点以及两条边界以外的点被当做支持向量,在预测中起作用。按照对偶形式的表示,最终的模型是所有训练样本的线性组合,其他不是支持向量的点的权重为0. 下面补充SVR模型的代价函数的图形:

图12:soft margin SVR的代价函数

从图12中可以看到,在margin内部的这些点的error都为0,只有超出了margin的点才会计算error。因此SVR的任务就是利用一条固定宽度的条带(宽度由参数$\\epsilon$来控制)覆盖尽可能多的样本点,从而使得总误差尽可能的小。

 

 

Reference


https://zh.wikipedia.org/wiki/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA

https://zhuanlan.zhihu.com/p/26263309, 直线方程的各种形式

https://github.com/ageron/handson-ml/blob/master/05_support_vector_machines.ipynb

http://www.svms.org/regression/SmSc98.pdf

http://www.robots.ox.ac.uk/~az/lectures/ml/

edx: UCSanDiegoX - DSE220x Machine Learning Fundamentals

https://github.com/OnlyBelter/jupyter-note/blob/master/machine_learning/SVM/04_how%20SVM%20becomes%20to%20SVR.ipynb, 文中代码

 

修改记录:

2020.12.19 typo fix

以上是关于svr算法和svm算法哪个好的主要内容,如果未能解决你的问题,请参考以下文章

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

ML-9-4支持向量机--SVM回归模型(SVR)

SVM 支持向量机算法(Support Vector Machine )Python机器学习系列(十四)

机器学习二十二:支持向量机回归SVR

深度学习之算法选择

深度学习之算法选择