往简单里说,核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并指望映射后的数据在高维空间里是线性可分的。算法
咱们以异或数据集为例:在二维空间中、异或数据集是线性不可分的;可是经过将其映射到三维空间、咱们能够很是简单地让其在三维空间中变得线性可分。
好比定义映射:网络
该映射的效果以下图所示:
能够看到,虽然左图的数据集线性不可分、但显然右图的数据集是线性可分的,这就是核工做原理的一个不太严谨但仍然合理的解释ide
从直观上来讲,确实容易想象、同一份数据在越高维的空间中越有可能线性可分,但从理论上是否确实如此呢?函数
1965 年提出的 Cover 定理从理论上解决了这个问题,咱们会在文末附上相应的公式,这里暂时按下不表学习
至此,彷佛问题就转化为了如何寻找合适的映射、使得数据集在被它映射到高维空间后变得线性可分。测试
不过能够想象的是,现实任务中的数据集要比上文咱们拿来举例的异或数据集要复杂得多、直接构造一个恰当的的难度甚至可能高于解决问题自己。优化
而核方法的巧妙之处就在于,它能将构造映射这个过程再次进行转化、从而使得问题变得简易:它经过核函数来避免显式定义映射往简单里说,核方法会经过用可以表示成
的核函数
替换各算式中出现的内积
来完成将数据从低维映射到高维的过程。3d
换句话说、核方法的思想以下:code
设法找到核函数,它能返回样本点
、
被
做用后的内积blog
固然了,不难想象的是,并非全部的函数都可以对应一个映射(亦即不是全部的都能拆成
好比说,显然
至少须要是一个对称函数)。
幸运的是,1909 年提出的 Mercer 定理解决了这个问题,它的具体叙述会在文末给出。
Mercer 定理为寻找核函数带来了极大的便利。能够证实以下两族函数都是核函数:
那么核方法的应用场景有哪些呢?在 2002 年由 Scholkopf 和 Smola 证实的表示定理告诉咱们它的应用场景很是普遍。定理的具体内容一样会附在文末。
仍是用 GIF 来讲明问题最为形象。
当咱们对感知机应用核方法后,它就能对非线性数据集(好比螺旋线数据集)进行分类了,训练过程将以下:
简单来讲,就是把算法中涉及到样本的地方都经过某种变换、弄成样本的内积形式。以感知机为例,感知机的原始损失函数为:
为了让损失函数中的样本都变成内积形式,考虑令
(有没有发现核形式和对偶形式很像?( σ'ω')σ)
注意:为简洁,今后日后的推导和实现均以核感知机为例,核 SVM 的相关讨论会放在下一章介绍 SMO 算法时进行】
简洁起见,咱们仍是用梯度降低法来进行训练,为此咱们须要进行求导工做。假设当前模型参数为,
在参数
下的预测值为
,则:
为了加速训练,咱们须要将该算式向量化,为此咱们须要定义核矩阵。假设如今咱们有两组样本和
,那么它们的核矩阵即为:
对于训练过程而言,咱们关心的是训练样本之间的核矩阵
利用它,不难写出相应的向量化代码:
对于预测过程,咱们关心的是原样本和新样本之间的核矩阵。假设新样本为
,则
那么预测过程即为
因而关键就在于如何定义计算核矩阵的核函数了。
对于多项式核来讲,核函数的实现是直观的:
但对于 RBF 来讲就没那么直观了,用到了 Numpy 的高级实用技巧之一——升维:
固然直接用 for 来实现也是能够的,不过那将会很是很是慢……
若是思路可以整理清楚,那么核模型相比原模型来讲只有以下两点改变:
因此实现起来的话会有许多重复代码,这里就只展示其中最核心的部分(仍以核感知机为例):
1)Cover 定理
【注意:一般咱们会称知足这两个充要条件之一的函数为 Mercer 核函数而把核函数定义得更宽泛。
不过若是不打算在理论上深刻太多的话,将 Mercer 核函数简称为核函数是能够的。
此外,虽然说 Mercer 核函数确实具备 Hilbert 空间中的内积形式、但此时的 Hilbert 空间并不必定具备“维度”这么好的概念(或说、能够认为此时 Hilbert 空间的维度为无穷大;好比说 RBF 核,它映射后的空间就是无穷维的)】
3)表示定理
这意味着对于任意一个损失函数和一个单调递增的正则化项组成的优化问题、咱们都可以对其应用核方法
下一篇文章咱们则会抛开梯度降低这个有些“偷懒”的作法,并介绍一种叫序列最小最优化(SMO)的算法
但愿观众老爷们可以喜欢~
推荐阅读:
精选干货|近半年干货目录汇总----全是通俗易懂的硬货!欢迎阅读!
天然语言处理中CNN模型几种常见的Max Pooling操做
干货|很是详细的神经网络入门解释
欢迎关注公众号学习交流~