SVM回归

我们之前提到过,SVM算法功能非常强大:不仅支持线性与非线性的分类,也支持线性与非线性回归。它的主要思想是逆转目标:在分类问题中,是要在两个类别中拟合最大可能的街道(间隔),同时限制间隔侵犯(margin violations);而在SVM回归中,它会尝试尽可能地拟合更多的数据实例到街道(间隔)上,同时限制间隔侵犯(margin violation,也就是指远离街道的实例)。街道的宽度由超参数ϵ控制。下图展示的是两个线性SVM回归模型在一些随机线性数据上训练之后的结果,其中一个有较大的间隔(ϵ = 1.5),另一个的间隔较小(ϵ = 0.5)。

如果后续增加的训练数据包含在间隔内,则不会对模型的预测产生影响,所以这个模型也被称为是ϵ-insensitive。

我们可以使用sk-learn的LinearSVR类训练一个SVM回归,下面的代码对应的是上图中左边的模型(训练数据需要先做缩放以及中心化的操作,中心化又叫零均值化,是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0, 0)):

from sklearn.svm import LinearSVR

svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)

再处理非线性的回归任务时,也可以使用核化的SVM模型。例如,下图展示的是SVM回归在一个随机的二次训练集上的表现,使用的是二阶多项式核:

左边的图中有一个较小的正则(超参数C的值较大),而右边图中的正则较大(较小的C值)。

下面的代码上图中左边的图对应的模型,使用的是sk-learn SVR类(支持核方法)。SVR类等同于分类问题中的SVC类,并且LinearSVR类等同于分类问题中的LinearSVC类。LinearSVR类会随着训练集的大小线性扩展(与LinearSVC类一样);而SVR类在训练集剧增时,速度会严重下降(与SVC类一致):

from sklearn.svm import SVR

svm_poly_reg = SVR(kernel='poly', degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

SVMs也可以用于异常点(值)检测,具体可以参考sk-learn文档。

原理解释

在这章我们会解释SVM如何做预测,以及训练算法是如何工作的,先从线性SVM分类器开始。

首先,我们将所有的模型参数放入一个向量θ,包括偏置项参数θ0以及输入特征的权重θ到 θn,并且给所有数据实例增加一个偏置项x= 1。这里偏置项称为b,特征权重向量称为w。

决策方法与预测

线性SVM分类器模型在做预测时,对于输入的实例x,它会计算决策函数wTx + b = w1x1 + ⋯ + wnxn + b:如果结果是正的,则预测的类别ŷ就属于正类(1),否则属于反类(0),如下公式所示:

下面我们看一下SVM在之前iris数据集上训练后的决策函数图:

这是一个二维平面,因为数据集有两个特征(petal width与petal length)。决策边界是由那些让决策函数等于0的点组成:也就是两个平面的交线(由上图中实线表示)。

虚线代表的是令决策函数等于1或-1的点:这两条虚线平行且距决策边界的距离相等,组成了一个间隔。训练线性SVM分类器就是找到一对w与b的值,让这个间隔尽可能的宽的同时,还要避免或是限制间隔侵犯(margin violation)。避免间隔侵犯的结果就是硬间隔(hard margin),限制间隔侵犯的结果就是软间隔(soft margin)。

训练目标

上图的例子中我们看到这个决策函数的图像是一个平面,并且有一个坡度。这个坡度等同的是权重向量w的范数(norm):∥ w ∥。如果我们将这个坡度除以2,则那些令决策函数等于±1 的点会离决策边界两倍远。换句话说,坡度除以2会让间隔增加2倍。如下图所示:

所以我们希望最小化 ∥ w ∥ 的值以获取一个更大的间隔。不过,如果我们同时也希望避免间隔入侵(硬间隔),则我们需要让决策函数对所有训练数据中的“正”训练实例计算结果大于1,而对所有“负”训练实例的计算结果小于-1。如果我们对负实例(也就是y(i) = 0)定义t(i) = –1,对正实例(y(i) = 1)定义t(i) = 1,则我们可以使用约束t(i)(wT x(i) + b) ≥ 1 定义所有实例。

所以我们接下来可以将硬间隔SVM分类器目标表示为一个带约束的优化问题,如下公式:

这里可以看到,我们优化的不是∥ w ∥,而是½wTw,它等同于½∥ w 2。因为½∥ w 2的导数非常简单(也就是w),而∥ w ∥ 在w=0时不可微。优化算法在可微函数上工作效果更好。

为了达到软间隔(soft margin)目标,我们需要为每个实例i引入一个松弛变量ζ(i) ≥ 0,这个变量衡量的是第ith个实例被允许入侵间隔的程度。我们现在有两个冲突的目标:让松弛变量尽可能的小,以减少间隔入侵;同时还要让 ½∥ w 2 尽可能的小,以增加间隔。所以这就是为什么算法中引入超参数C:这个参数可以让我们定义这两个目标之间的权衡(tradeoff)。对应的带约束优化问题为:

二次规划

硬间隔与软间隔问题都是带线性约束的凸二次优化问题,这种就是常说的二次规划(Quadratic Programming,QP)问题。有很多现成的解决办法用于解决QP问题,在这不会深入讨论。这种常规问题的公式如下所示:

需要注意的是表达式Apb 定义了nc的约束:p a(i)b(i) for i = 1, 2, ⋯, nc, 这里a(i)代表的是包含了A的第ith行的向量,b(i)代表的是b的ith第个元素。

如果我们按下面的参数设置QP参数,则可以得到硬间隔线性SVM分类器的目标:

一个训练硬间隔线性SVM分类器的方法是使用已有的OP问题解决方法,传入上述参数即可。求得的结果向量p会包含偏执项b=p0,以及特征权重wi = pi for i = 1, 2, ⋯, n。类似的,也可以使用QP问题解决方案解决软间隔问题。

不过在使用核方法时,我们会使用另一个不同的带约束的优化问题。

在线SVMonline SVM

在这章结束之前,我们快速地看一下在线SVM分类器(在线学习是指递增的训练,一般在一个新实例到达时就训练一次)。

对于线性SVM分类器,一种方法是使用梯度下降(例如使用SGDClassifier)最小化以下损失函数:

这个损失函数是由原始问题推导得出,但是它的收敛速度相比基于QP方法的收敛会慢特别多。在这个损失函数中,第一个累加会推进模型去找一个较小的权重向量w,继而产生一个更大的间隔。第二个累加会计算所有的间隔入侵(margin violations)。一个实例如果是远离街道、且在它所属正确的那一侧,则它的间隔入侵为0;否则它的间隔入侵则为距离正确那一侧街道的距离的比例。最小化这个项,会确保模型尽可能少地造成间隔入侵。

最后提一下HINGE LOSS,我们之前在训练SVM时使用的是这个损失函数。它的函数为max(0, 1-t)。在 t ≥ 1时,输出为0。它的导数在t < 1 时等于 -1,在t > 1 时等于0 ;在t=1时不可微,不过仍可以在使用梯度下降时,使用t=1 时的任何次导数(也就是说,任何在-1到0之间的值)。函数图如下:

在在线SVM中,也是可以实现在线核化SVM的,例如使用“Incremental and Decremental SVM Learning” 或”Fast Kernel Classifiers with Online and Active Learning”。不过这些是通过Matlab和C++实现的。对于大型的非线性问题,我们其实可以考虑使用神经网络。

SVM-支持向量机(三)SVM回归与原理的更多相关文章

  1. SVM 支持向量机算法-原理篇

    公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...

  2. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

  3. 机器学习--支持向量机 (SVM)算法的原理及优缺点

    一.支持向量机 (SVM)算法的原理 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析.它是将向量映射到一个更高维的 ...

  4. 支持向量机(SVM)原理阐述

    支持向量机(Support Vector Machine, SVM)是一种二分类模型.给定训练集D = {(x1,y1), (x2,y2), ..., (xm,ym)},分类学习的最基本的想法即是找到 ...

  5. 4. 支持向量机(SVM)原理

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  6. 支持向量机(SVM)、支持向量回归(SVR)

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

  7. 支持向量机(SVM)

    断断续续看了好多天,赶紧补上坑. 感谢july的 http://blog.csdn.net/v_july_v/article/details/7624837/ 以及CSDN上淘的比较正规的SMO C+ ...

  8. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/ ...

  9. SVM(支持向量机)算法

    第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...

随机推荐

  1. Cesium案例解析(三)——Camera相机

    目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...

  2. opencv —— findContours、drawContours 寻找并绘制轮廓

    轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...

  3. UCF Local Contest 2015 J 最小割

    题意: 有

  4. Blazor client-side + webapi (.net core 3.1) 添加jwt验证流程(非host)第二步 添加Identity

    添加Identity数据上下文 安装nuget包:Microsoft.AspNetCore.Identity.EntityFrameworkCore 创建ApplicationDbContext类 创 ...

  5. C#的委托案例

    C#实现(Delegate)的委托就不多说了,直接上代码,看代码中的注释: namespace Delegate { delegate void DGSayiHi(string name);//声明委 ...

  6. docker之阿里云centos 7.x 启动容器报错处理办法

    最近阿里云服务器(操作系统centOS 7.x) 安装docker,参照阿里云帮助文档https://help.aliyun.com/document_detail/51853.html?spm=a2 ...

  7. 如何在Idea中使用Git将项目代码上传到码云

    参考链接:https://blog.csdn.net/zzybbh/article/details/88172140

  8. Quartz.NET - 教程 5: 简单触发器

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...

  9. malloc分配内存的结构

    在C/C++,我们都可以使用malloc进行分配大小,单位是字节.   malloc实际分配的内存大小和传入的参数其实是不同的.   实际分配的内存大小>传入的参数大小. malloc分配的内存 ...

  10. 数据库设计工具-powerdesigner

    一.PowerDesigner导出SQL,注释为空时以name代替 操作步骤 1. 2. 3.将Value中的内容全部替换为如下 %:COLUMN% [%National%?national ]%DA ...