svm核函数的理解和选择

2023-05-16

特征空间的隐式映射:核函数

    咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。

    此外,因为训练样例一般是不会独立出现的,它们总是以成对样例的内积形式出现,而用对偶形式表示学习器的优势在为在该表示中可调参数的个数不依赖输入属性的个数,通过使用恰当的核函数来替代内积,可以隐式得将非线性的训练数据映射到高维空间,而不增加可调参数的个数(当然,前提是核函数能够计算对应着两个输入特征向量的内积)。

    在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图7-7所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:

 

    而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:

    这里ϕ:X->F是从输入空间到某个特征空间的映射,这意味着建立非线性学习器分为两步:

  1. 首先使用一个非线性映射将数据变换到一个特征空间F,
  2. 然后在特征空间使用线性学习器分类。

    而由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:

    如果有一种方式可以在特征空间中直接计算内积〈φ(xi · φ(x),就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:

    核是一个函数K,对所有x,z(-X,满足,这里φ是从X到内积特征空间F的映射。

核函数:如何处理非线性数据

    来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)?

  

    事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用  和  来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:

    注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 , , , , ,那么显然,上面的方程在新的坐标系下可以写作:

    关于新的坐标  ,这正是一个 hyper plane 的方程!也就是说,如果我们做一个映射  ,将  按照上面的规则映射为  ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是Kernel 方法处理非线性问题的基本思想。

    再进一步描述 Kernel 的细节之前,不妨再来看看这个例子映射过后的直观例子。当然,你我可能无法把 5 维空间画出来,不过由于我这里生成数据的时候就是用了特殊的情形,具体来说,我这里的超平面实际的方程是这个样子(圆心在  轴上的一个正圆):

    因此我只需要把它映射到 , ,  这样一个三维空间中即可,下图即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的(pluskid:下面的gif 动画,先用 Matlab 画出一张张图片,再用 Imagemagick 拼贴成):

    核函数相当于把原来的分类函数:

    映射成:

    而其中的可以通过求解如下 dual 问题而得到的:

    这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射 ,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!其实刚才的方法稍想一下就会发现有问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;如果原始空间是三维,那么我们会得到 19 维的新空间,这个数目是呈爆炸性增长的,这给 的计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。所以就需要 Kernel 出马了。

    不妨还是从最开始的简单例子出发,设两个向量,而即是到前面说的五维空间的映射,因此映射过后的内积为:

        (公式说明:上面的这两个推导过程中,所说的前面的五维空间的映射,这里说的前面便是文中2.2.1节的所述的映射方式,回顾下之前的映射规则,再看那第一个推导,其实就是计算x1,x2各自的内积,然后相乘相加即可,第二个推导则是直接平方,去掉括号,也很容易推出来)

    另外,我们又注意到:

     二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射

     之后的内积的结果是相等的,那么区别在于什么地方呢?

  1. 一个是映射到高维空间中,然后再根据内积的公式进行计算;
  2. 而另一个则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果

    (公式说明:上面之中,最后的两个式子,第一个算式,是带内积的完全平方式,可以拆开,然后,通过凑一个得到,第二个算式,也是根据第一个算式凑出来的)

    回忆刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。

    我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:

    核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里需要计算的地方数据向量总是以内积的形式出现的。对比刚才我们上面写出来的式子,现在我们的分类函数为:

    其中 由如下 dual 问题计算而得:

    这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。

几个核函数

    通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:

  • 多项式核,显然刚才我们举的例子是这里多项式核的一个特例(R = 1,d = 2)。虽然比较麻烦,而且没有必要,不过这个核所对应的映射实际上是可以写出来的,该空间的维度是,其中 是原始空间的维度。
  • 高斯核,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:
  • 线性核,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

核函数的本质

        上面说了这么一大堆,读者可能还是没明白核函数到底是个什么东西?我再简要概括下,即以下三点:

  1. 实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(如上文2.2节最开始的那幅图所示,映射到高维空间后,相关特征便被分开了,也就达到了分类的目的);
  2. 但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的(如上文中19维乃至无穷维的例子)。那咋办呢?
  3. 此时,核函数就隆重登场了,核函数的价值在于它虽然也是讲特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。

    最后引用这里的一个例子举例说明下核函数解决非线性问题的直观效果。

    假设现在你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你需要搭建一个篱笆来把羊群围起来。但是篱笆应该建在哪里呢?你很可能需要依据牛群和狼群的位置建立一个“分类器”,比较下图这几种不同的分类器,我们可以看到SVM完成了一个很完美的解决方案。

    这个例子从侧面简单说明了SVM使用非线性分类器的优势,而逻辑模式以及决策树模式都是使用了直线方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

svm核函数的理解和选择 的相关文章

  • 使用 opencv 构建自定义 svm 内核矩阵

    我必须训练支持向量机模型 并且我想使用自定义内核矩阵 而不是预设的矩阵 如 RBF Poly 等 我怎样才能用opencv的机器学习库做到这一点 如果可能的话 谢谢你 AFAICT OpenCV 不直接支持 SVM 的自定义内核 看起来 L
  • Opencv中SVM参数优化

    我想优化Opencv中的SVM参数 但是 每次我使用train auto I get C 1 and gamma 1 有些人使用 LibSVM 但我无法为此编写包装器 两个都trainingData and labels取自现有代码 该代码
  • SVM 的标准化特征值

    我一直在尝试一些 SVM 实现 我想知道 标准化特征值以适应一个范围的最佳方法是什么 从0到1 假设我有 3 个特征 其值范围为 3 5 0 02 0 05 10 15 如何将所有这些值转换为 0 1 范围 如果在训练期间 我将遇到的特征号
  • 使用 Scikit Learn SVM 准备文本分类数据

    我正在尝试应用 Scikit learn 中的 SVM 对我收集的推文进行分类 因此 将有两个类别 将它们命名为 A 和 B 目前 我将所有推文分类为两个文本文件 A txt 和 B txt 但是 我不确定 Scikit Learn SVM
  • ValueError:类的数量必须大于一(python)

    经过时x y in fit 我收到以下错误 回溯 最近一次调用最后一次 文件 C Classify classifier py 第 95 行 位于 train avg test avg cms train model X y ceps pl
  • Sklearn LinearSVC库中惩罚参数和损失参数的区别

    我对 SVM 理论不太熟悉 我在 python 中使用这个 LinearSVC 类 http scikit learn org stable modules generated sklearn svm LinearSVC html skle
  • 用于多对象分类的支持向量机

    我正在尝试使用线性支持向量机进行多类对象类别识别 到目前为止 我了解到主要使用两种方法 一对一 OVA 和一对一 OVO 但我很难理解它的实现 我的意思是我认为使用的步骤是 首先 特征描述符是通过 SIFT 准备的 所以我有一个 128XN
  • 如何使用libsvm进行文本分类?

    我想用 SVM 编写一个垃圾邮件过滤器程序 我选择 libsvm 作为工具 我收到了 1000 封好指甲和 1000 封垃圾邮件 然后我将它们分类为 700 封 good train 邮件 700 封 spam train 邮件300 封
  • 如何获取Scikit-learn的svm中的训练误差?

    我的问题 如何获取 svm 模块 SVC 类 中的训练误差 我正在尝试根据所使用的训练数据数量 或其他特征 例如 C gamma 绘制训练集和测试集的误差图 然而 根据支持向量机文档 http scikit learn org stable
  • 使用线性内核调整 SVM 时,R 插入符异常缓慢

    在调整 SVM 参数时 我观察到一个非常奇怪的行为caret 当训练单个模型而不进行调整时 具有径向基核的 SVM 比具有线性核的 SVM 花费更多时间 这是预期的 然而 当在相同的惩罚网格上调整具有两个核的 SVM 时 具有线性核的 SV
  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • Opencv:使用 FAST 关键点和 Brief 特征训练 SVM

    我想训练一个用于对象检测的支持向量机 此时 我有一个 python 脚本 可以检测 FAST 关键点并提取该位置的 Brief 特征 现在我不知道如何使用这些描述符来训练 SVM 请你告诉我 如何使用描述符来训练SVM 据我所知这些描述符应
  • 带有 SVM 基分类器的 AdaBoost 的执行时间

    我刚刚用这些参数制作了一个 Adaboost 分类器 1 n estimators 50 2 base estimator svc 支持向量分类器 3 learning rate 1 这是我的代码 from sklearn ensemble
  • ValueError:此求解器需要数据中至少 2 个类的样本,但数据仅包含一个类:1.0

    我有一个包含 8670 次试验的训练数据集 每个试验的长度为 125 次样本 而我的测试集由 578 次试验组成 当我应用 scikit learn 中的 SVM 算法时 我得到了非常好的结果 但是 当我应用逻辑回归时 会出现此错误 Val
  • R - mlr:是否有一种简单的方法可以在嵌套重采样(空间)中获得调整后的支持向量机模型的可变重要性?

    我正在尝试获取可变重要性对于a的所有预测变量 或变量 或特征 调优支持向量机 SVM 模型使用e1071 svm通过mlr 封装在R 但我不确定我的评估是否正确 好吧 一开始的想法是 为了获得诚实调整的 svm 模型 我遵循嵌套重采样教程
  • Python OpenCV SVM 实现

    因此 我有一个包含样本图像的矩阵 全部转换为向量 该矩阵通过 PCA LDA 运行 还有一个向量表示每个图像所属的类 现在我想使用 OpenCV SVM 类来训练我的 SVM 我使用的是 Python OpenCV 2 3 1 但我在定义参
  • R SVM 对于缺失数据的预测返回 NA

    我尝试使用 e1071 包中经过训练的 SVM 进行预测 但我的数据包含一些缺失值 NA 当该实例有任何缺失值时 我希望返回的预测为 NA 我尝试使用 na action na pass 如下 但它给了我一个错误 名称错误 ret2 如果我
  • 一类 SVM libSVM

    假设我的特征向量是 x1 x2 xn 谁能给我一个使用 libSVM 训练一类 SVM 的代码 我应该如何使用交叉验证来学习参数 这可能对你有帮助 label ones Number Of your training instances 1
  • 使用 scikit-learn OneClassSVM 时获取每个新观察结果为异常值的概率

    我是 scikit learn 和 SVM 方法的新手 我的数据集与 scikit learn OneClassSVM 配合良好 可以检测异常值 我使用观察来训练 OneClassSVM 所有这些都是 内点 然后使用 Predict 对我的
  • 使用 libsvm 交叉验证后重新训练

    我知道交叉验证用于选择好的参数 找到它们后 我需要在不使用 v 选项的情况下重新训练整个数据 但我面临的问题是 在使用 v 选项训练后 我得到了交叉验证精度 例如 85 没有模型 我看不到 C 和 gamma 的值 在这种情况下我该如何重新

随机推荐

  • Springboot2中文件上传报java.io.FileNotFoundException: C:\Users\WIzarder\AppData\Local\Temp\tomcat.8080.589

    Springboot2文件上传中用MultipartFile接受文件 xff0c 上传报错java io FileNotFoundException C Users WIzarder AppData Local Temp tomcat 80
  • String为什么叫不可变字符序列,StringBuffer和StringBuild为什么是可变字符序列

    String为什么叫不可变字符序列 xff0c StringBuffer和StringBuild为什么是可变字符序列 xff1f 当我第一次学习JavaSE基础知识里 xff0c 学习String和StringBuffer和StringBu
  • Linux中xshell连接不上问题

    inux中Xshell连接失败 原因 xff1a 网络配置问题 xff0c 还有可能是防火墙问题 xff0c ssh未开启问题 xff0c 本人遇到的是网络配置问题 首先是配置Linux网络 cd etc sysconfig network
  • 项目迁移AndroidX

    什么是AndroidX 简单地说就是新的库可以在不同的Android版本上使用 比如之前我们如果使用support为27 1 1的相关依赖库时 可能需要所有相关的support 库都为27 1 1 如果其中有bug的话 xff0c 可能需要
  • Win11更新后电脑没有声音,声卡驱动失效,卸载重装依然无效

    win11更新后声卡驱动失效 xff0c 没有声音 原因 xff1a windows自动更新会更新你的声卡驱动 xff0c 声卡驱动冲突了 解决办法 xff1a 卸载重装声卡驱动依然无效走下面流程 右击电脑 gt 管理 gt 设备管理器 g
  • Docker Unbuntu容器里面运行apt-get update命令报错

    最近在尚硅谷学习docker命令 xff0c 学习到给ubuntu添加vim命令时候运行apt get update报错如下所示 搜索了半天发现很多人让配置dns啥的 xff0c 有一个博主推荐在运行容器的时候添加一个参数可以解决上述问题
  • 华为2288H服务器配置raid

    本次配置的服务器品牌型号为华为2288H 清除现有的raid重新设置就可以 xff0c 只有设备在uefi模式下才能看到配置raid xff0c 所以要先在bios下把传统模式改成uefi模式
  • MBR&/BOOT和GRUB三者关系总结

    做了一个大自然的搬运工 介绍的不错 备份下 MBR是硬盘上的一个扇区 包含三部分内容 xff08 引导程序 分区表及分隔标识 xff0c MBR总计512字节 xff1b 其中引导程序最多占446个字节 xff09 xff1b 为什么需要这
  • 寄存器映射与直接操作寄存器

    一 存储器映射 与重映射 存储器本身不具有地址信息 xff0c 它的地址是由芯片厂商或用户分配 xff0c 给 物理 存储器分配 逻辑 地址的过程就称为存储器映射 xff0c 通过这些逻辑地址就可以访问到相应的存储器的物理存储单元 如果给存
  • html+js翻页时钟

    html 43 js翻页时钟 index html lt doctype html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt html5带翻
  • 云计算的主要部署模式

    云计算与大数据 云计算的最终目标是将计算 服务和应用作为一种公共设施提供给公众 xff0c 使人们能够像使用水 电 煤气和电话那样使用计算机资源 云计算技术都是基于3种特殊的云计算服务模式 xff0c 它们都具有流行 有效 灵活 用户友好等
  • TP5 + PHPWord导出word文档中文出现乱码的问题

    场景 xff1a 项目需要将html页面转word文档 1 下载安装phpword插件composer require phpoffice phpword 2 安装成功在tp目录下的vendor会出现phpoffice文件夹 xff0c 说
  • 基于 Matlab/simulink的锂电池建模与仿真——复现论文《基于二阶EKF的锂离子电池SOC估计的建模与仿真》的仿真部分

    运用simulink实现该论文的锂电池建模仿真 1 模型分解1 1 SOC计算模块1 2 RC参数计算模块1 3 电压计算模块1 4 电流生成器 由Singal Builder模块生成 2 建模细节详解2 1 SOC OCV xff1a L
  • Qt使用记录

    Q amp A 1 错误 qt network ssl QSslSocket cannot call 解决 Qt5 12 4 Tools mingw730 64 opt bin下的libeay32 dll和ssleay32 dll拷贝到Qt
  • Keras的自定义lambda层去reshape tensor张量时model保存出错的解决办法

    背景 分割网络在进行上采样的时候我用的是双线性插值上采样的 xff0c 而Keras里面并没有实现双线性插值的函数 xff0c 所以要自己调用tensorflow里面的tf image resize bilinear 函数来进行resize
  • c++ 中 class 和 struct 的区别是什么

    xfeff xfeff C 43 43 中的struct对C中的struct进行了扩充 xff0c 它已经不再只是一个包含不同数据类型的数据结构了 xff0c 它已经获取了太多的功能 struct能包含成员函数吗 xff1f 能 xff01
  • Linux top命令的了解以及使用

    以root权限运行 top 命令后 xff0c 会以全屏的方式显示 xff0c 并且会处在对话的模式 操作实例 root登录之后 xff0c 在命令行中输入 xff1a top xff0c 回车 xff0c 即会以全屏的显示模式显示所有内容
  • 一键激活office,激活windows

    github地址 xff1a https github com massgravel Microsoft Activation Scripts 正文 xff1a Microsoft Activation Scripts MAS A Wind
  • Jupyter not connection to kernel 的解决方案

    不知道什么原因 xff0c 今天启动Jupyter Notebook发现不对经 xff0c 各种警告如 xff1a 内核没有连接什么的 xff0c 然后我试了试用spyder编写Python xff0c 结果一进去也是告诉我 error x
  • svm核函数的理解和选择

    特征空间的隐式映射 xff1a 核函数 咱们首先给出核函数的来头 xff1a 在上文中 xff0c 我们已经了解到了SVM处理线性可分的情况 xff0c 而对于非线性的情况 xff0c SVM 的处理方法是选择一个核函数 xff0c 通过将