python svm核函数_Python.SVM(三)核方法
Python.SVM(三)核方法
1
什么是核方法
往简单里说,核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并期望映射后的数据在高维空间里是线性可分的。
我们以异或数据集为例:在二维空间中、异或数据集是线性不可分的;但是通过将其映射到三维空间、我们可以非常简单地让其在三维空间中变得线性可分。
比如定义映射:
该映射的效果如下图所示:
可以看到,虽然左图的数据集线性不可分、但显然右图的数据集是线性可分的,这就是核工作原理的一个不太严谨但仍然合理的解释
从直观上来说,确实容易想象、同一份数据在越高维的空间中越有可能线性可分,但从理论上是否确实如此呢?
1965 年提出的 Cover 定理从理论上解决了这个问题,我们会在文末附上相应的公式,这里暂时按下不表
至此,似乎问题就转化为了如何寻找合适的映射、使得数据集在被它映射到高维空间后变得线性可分。
不过可以想象的是,现实任务中的数据集要比上文我们拿来举例的异或数据集要复杂得多、直接构造一个恰当的的难度甚至可能高于解决问题本身。
而核方法的巧妙之处就在于,它能将构造映射
这个过程再次进行转化、从而使得问题变得简易:它通过核函数来避免显式定义映射往简单里说,核方法会通过用能够表示成
的核函数
替换各算式中出现的内积
来完成将数据从低维映射到高维的过程。
换句话说、核方法的思想如下:
将算法表述成样本点内积的组合(这经常能通过算法的对偶形式实现)
设法找到核函数
,它能返回样本点
、
被
作用后的内积
用
替换
、完成低维到高维的映射(同时也完成了从线性算法到非线性算法的转换)
当然了,不难想象的是,并不是所有的函数都能够对应一个映射(亦即不是所有的
都能拆成
比如说,显然
至少需要是一个对称函数)。
幸运的是,1909 年提出的 Mercer 定理解决了这个问题,它的具体叙述会在文末给出。
Mercer 定理为寻找核函数带来了极大的便利。可以证明如下两族函数都是核函数:
那么核方法的应用场景有哪些呢?在 2002 年由 Scholkopf 和 Smola 证明的表示定理告诉我们它的应用场景非常广泛。定理的具体内容同样会附在文末。
2
核模型的表现
还是用 GIF 来说明问题最为形象。
当我们对感知机应用核方法后,它就能对非线性数据集(比如螺旋线数据集)进行分类了,训练过程将如下:
3
怎么应用核方法
简单来说,就是把算法中涉及到样本的地方都通过某种变换、弄成样本的内积形式。以感知机为例,感知机的原始损失函数为:
为了让损失函数中的样本都变成内积形式,考虑令
(有没有发现核形式和对偶形式很像?( σ'ω')σ)
4
如何训练核模型
注意:为简洁,从此往后的推导和实现均以核感知机为例,核 SVM 的相关讨论会放在下一章介绍 SMO 算法时进行】
简洁起见,我们还是用梯度下降法来进行训练,为此我们需要进行求导工作。假设当前模型参数为
,
在参数
下的预测值为
,则:
为了加速训练,我们需要将该算式向量化,为此我们需要定义核矩阵。假设现在我们有两组样本
和
,那么它们的核矩阵即为:
对于训练过程而言,我们关心的是训练样本之间的核矩阵
利用它,不难写出相应的向量化代码:
对于预测过程,我们关心的是原样本和新样本之间的核矩阵。假设新样本为
,则
那么预测过程即为
于是关键就在于如何定义计算核矩阵的核函数了。
对于多项式核来说,核函数的实现是直观的:
但对于 RBF 来说就没那么直观了,用到了 Numpy 的高级实用技巧之一——升维:
当然直接用 for 来实现也是可以的,不过那将会非常非常慢……
5
核模型的实现
如果思路能够整理清楚,那么核模型相比原模型来说只有如下两点改变:
需要定义核函数并计算出核矩阵
计算预测值时不是
,而是
,其中
在训练时,K为原样本之间的核矩阵
在测试时,K为原样本和新样本的核矩阵
所以实现起来的话会有许多重复代码,这里就只展现其中最核心的部分(仍以核感知机为例):
6
相关数学理论
1)Cover 定理
【注意:通常我们会称满足这两个充要条件之一的函数为 Mercer 核函数而把核函数定义得更宽泛。
不过如果不打算在理论上深入太多的话,将 Mercer 核函数简称为核函数是可以的。
此外,虽说 Mercer 核函数确实具有 Hilbert 空间中的内积形式、但此时的 Hilbert 空间并不一定具有“维度”这么好的概念(或说、可以认为此时 Hilbert 空间的维度为无穷大;比如说 RBF 核,它映射后的空间就是无穷维的)】
3)表示定理
这意味着对于任意一个损失函数和一个单调递增的正则化项组成的优化问题、我们都能够对其应用核方法
下一篇文章我们则会抛开梯度下降这个有些“偷懒”的做法,并介绍一种叫序列最小最优化(SMO)的算法
希望观众老爷们能够喜欢~
推荐阅读:
精选干货|近半年干货目录汇总----全是通俗易懂的硬货!欢迎阅读!
自然语言处理中CNN模型几种常见的Max Pooling操作
干货|非常详细的神经网络入门解释
欢迎关注公众号学习交流~
python svm核函数_Python.SVM(三)核方法相关推荐
- python下载方法-python实现下载文件的三种方法_python
本篇文章主要介绍了python实现下载文件的三种方法,最常用的方法就是通过Http利用urllib或者urllib2模块还有requests,有兴趣的可以了解一下. Python开发中时长遇到要下载文 ...
- python 下载文件-python实现下载文件的三种方法_python
本篇文章主要介绍了python实现下载文件的三种方法,最常用的方法就是通过Http利用urllib或者urllib2模块还有requests,有兴趣的可以了解一下. Python开发中时长遇到要下载文 ...
- python下载的文件放在哪里的-python实现下载文件的三种方法
Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...
- python记录程序运行时间的三种方法
这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下: 方法1 import datetime starttime = datetime.datetime.now ...
- python中pca算法_Python使用三种方法实现PCA算法
主成分分析(PCA) vs 多元判别式分析(MDA) PCA和MDA都是线性变换的方法,二者关系密切.在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣. 一句 ...
- matlab svm核函数选择,SVM分类核函数及参数选择比较.pdf
Compu~r Engineering口 4 胁日ff0 计算机工程与应用 SVM分类核函数及参数选择比较 奉国和 FENG Guohe 华南师范大学 经济管理学院 信息管理系,广州 5 10006 ...
- python 网站文件下载-python实现下载文件的三种方法
Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...
- python 随机生成汉字的三种方法
第一种方法:Unicode码 在unicode码中,汉字的范围是(0x4E00, 9FBF) 这个方法比较简单,但是有个小问题,unicode码中收录了2万多个汉字,包含很多生僻的繁体字. 第二种方法 ...
- python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法
0. 实验环境Ubuntu 16.04 Matlab R2015b 1. 借助于 mlab 库 安装方法非常简单,只需一行命令 sudo pip install mlab 即可. import num ...
- python合并ts视频(三种方法)
前言:最近在爬取某个网站的视频,但是里面的视频数据是以ts文件的形式给出的.一个大的视频被切分成了很多小的ts视频,所以,合并这些ts视频就成为必要的了.我在网上搜到了三种方法,现在整理出来分享给大家 ...
最新文章
- Nginx + Lua + redis (一)(转)
- 韩国踩点跪:自愿向美交半导体机密,曾放话硬刚
- CentOS-Samba服务
- Jira 随便总结
- 最短路径问题matlab作图,[MATLAB基础] matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点...
- Python中is与==的使用区别详解
- LeetCode 1237. 找出给定方程的正整数解
- 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
- 2017 年全国大学生电子设计竞赛(本科组)题目√
- Qt Designer简介
- 直观理解深度学习中的反卷积、导向反向传播
- FRS.0020The subservice has not been subscribed.解决方案
- 从物联网到元宇宙-李正海在物联网大会上的发言
- c++ 简易人员信息管理系统
- linux wine运行效率,Linux 使用 Wine 运行 TIM 简明教程
- B.ljw 养蔷薇(普通莫队)
- 【华为重启门】华为/荣耀手机一直自动重启原因解决方案(荣耀V10)
- 使用NVM安装NodeJS并解决npm下载依赖失效问题(最全流程)
- 二叉查找树(1)-二叉树-数据结构和算法(Java)
- 邻接表:有权图获取边的权值