SVM之核函数
>>>SVM之核函数
上一篇SVM之对偶问题中讨论到,SVM最终形式化为以下优化问题\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}<{{x}^{i}},{{x}^{j}}>} \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0 \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0 \\\end{matrix} \right. \\\end{matrix} \right.\end{align}\]
而且最终的判别式可以写成\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}<{{x}^{i}},x>}+b\end{align}\]
之前已对(1)的求解做了简单提及,需要注意的是,优化问题(1)虽然可以直接求解,但是要基于训练数据线性可分的基础,如果数据本身线性不可分呢?
解决方法之一就是将数据,或者更加正式的称为特征,向高维映射,以期待映射后数据在更高维的空间中数据可分,这样就可以在新的高维空间中继续使用之前的方法。
简单起见,考虑一维不可分的数据
显然,原始的一维数据是线性不可分的,现在取映射$\phi (x)=(x,{{x}^{2}})$ 将原始的一维数据映射到二维,数据变的线性可分了。这种向高维映射的方法一定程度上解决的线性不可分问题,但同时也带来了相当的计算复杂度。
SVM现在将在新的二维空间运行,原来问题中的$x$ 将用$\phi (x)$ 取代,优化问题中向量内积$<{{x}^{i}},{{x}^{j}}>$ 也将被$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$ 取代,判别函数中向量内积$<{{x}^{i}},x>$也将被$<\phi ({{x}^{i}}),\phi (x)>$取代,换句话说,我们需要将原来所有一维训练样本首先一个个计算,映射到新的二维空间,然后在二维空间中计算新样本之间的内积。这与原来直接在一维空间中直接计算一维向量内积相比,虽然并不会复杂多少,然而随着样本维度和映射后维度的增加,计算复杂的的提升是非常显著的,甚至变得不可计算。(这不是危言损听,比如高斯核将样本映射的无限维空间,那么怎么计算呢?)
已经说过,上面的过程是由两个步骤组成的。首先是映射,其次是计算映射后的内积。但其实我们真正需要的知道的只是映射后的内积,我们不需要$\phi (x)$ 、$\phi ({{x}^{i}})$ 、$\phi ({{x}^{j}})$ ,我们真正需要的是$<\phi ({{x}^{i}}),\phi ({{x}^{j}})>$和$<\phi ({{x}^{i}}),\phi (x)>$,这对优化问题(1)和判别函数(2)来说已经足够了。然而,怎么绕过映射本身而直接求解映射后向量内积呢?核函数就是用来做这样的事情。
核函数定义为 \[\begin{align}K(x,y)=<\phi (y),\phi (y)>\end{align}\]
以上核函数的定义应该来讲是“意义化”的,而不是“计算化”的,定义中出现$\phi (x)$ 、$\phi (y)$ 并不表明需要显式计算映射本身,而是来说明核函数的意义是映射后向量的内积,而核函数“计算化”的定义是需要我们自己设计给出的。
还是上面一维到二维的例子,考虑两个一维样本$x$和$y$ 映射到二维样本$\phi (x)=(x,{{x}^{2}})$ 和$\phi (y)=(y,{{y}^{2}})$,则\[\begin{align*}<\phi (x),\phi (y)> & ={{(x,{{x}^{2}})}^{T}}(y,{{y}^{2}}) \\& =xy+{{(xy)}^{2}} \\\end{align*}\]
那么,我们就可以定义对应的核函数为\[K(x,y)=xy+{{(xy)}^{2}}\],这和映射到二维后再计算内积的结果是一样的,但是现在直接计算$K(x,y)=xy+{{(xy)}^{2}}$使得我们不需要关心映射本身,而且计算是在原来的一维空间进行的。当样本维度增加时,这样方法带来的计算优势是不言而喻的。这就是核函数的主要作用,它隐藏映射本身而直接在低维空间计算高维空间向量的内积,显著降低计算复杂度。这简直就像加了特技,duang一下就完成了高维空间内积的计算,所以有些文献将核函数称为kernel trick,是trick,是特技!
那么,当我们需要将样本向高维空间映射以期望将数据变得线性可分时,怎样找到这种映射对应的核函数呢?上面一维到二维的示例过于简单,可以很方便的找到对应的核函数,当样本维度较高时,设计一个核函数并非易事。幸运的是,牛人们已经帮我们设计好了许多核函数,所以我们现在不需要根据映射去设计对应的精确的核函数,而是反过来选取设计好的核函数来尽可能满足我们的映射,保证映射后数据尽可能的线性可分。
常见的核函数有高斯核、多项式核、感知器核等。
高斯核:$K(x,y)=\exp (-\frac{{{\left\| x-y \right\|}^{2}}}{2{{\sigma }^{2}}})$
多项式核:$K(x,y)={{(<x,y>+c)}^{d}}$
感知器核:$K(x,y)=\tanh ({{\rho }_{1}}<x,y>+{{\rho }_{2}})$
这些核函数都对应不同的映射,拥有不同的性质。比如高斯核对应一个到无限维空间的映射,而且高斯核的意义比较明确:对原空间内相近的两个向量$x$、$y$计算 结果的数值较大,反之较小,参数$\sigma $ 控制这核函数值随${{\left\| x-y \right\|}^{2}}$变化的速度;多项式核对应一个到$C_{n+d}^{d}$ 维的映射。仅从这两个其他核函数的映射维度来看,核函数在降低计算复杂度上是很显著的,比如对多项式核,可以取$n$ (原样本维度)和$d$ 为不同值,看看映射后维度有多高。其他关于核函数本身的性质可以去查看专门的文献。作为一般应用,以上几个核函数可能在很多情况下已经够用了,而且高斯核应用最广。
已经选取好核函数之后,需要做到就是将原来的优化问题和判别函数中的向量内积用核函数替代,这样优化问题变为:\[\begin{align}\left\{ \begin{matrix}\underset{\alpha }{\mathop{\max }}\,\sum\limits_{i}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j}{{{\alpha }_{i}}{{\alpha }_{j}}{{y}^{i}}{{y}^{j}}K(x{{,}^{i}}{{x}^{j}})} \\s.t.\left\{ \begin{matrix}{{\alpha }_{i}}\ge 0 \\\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}}=0 \\\end{matrix} \right. \\\end{matrix} \right.\end{align}\]
判别函数变为:\[\begin{align}{{w}^{T}}x+b=\sum\limits_{i}{{{\alpha }_{i}}{{y}^{i}}K({{x}^{i}},x)}+b\end{align}\]
现在我们去求解优化问题(4)后用判别式(5)对新样本分类。
需要注意,核函数不是SVM的专利,只是在SVM中的一个应用,其他所有存在向量内积的场景,如果需要都可以引人核函数。
核函数隐藏着一个到高维的映射,可能使得数据在高维变得线性可分,但并不保证映射后一定是线性可分的。那怎样彻底处理线性不可分的问题呢?其实可以换个思路,我们并不要求数据一定得线性可分,不过如果有些样本错分了,我们给它一个惩罚代价,并将惩罚代价引人优化目标,这样的话,虽然分类器不能保证对训练数据线性可分,但它会根据我们给出的惩罚因子找到代价最小的分类器。这个问题将在下一篇文章SVM之解决线性不可分中介绍。
SVM之核函数的更多相关文章
- 6. 支持向量机(SVM)核函数
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- svm常用核函数介绍
这里有一篇博文介绍了,每个核函数的用途: https://blog.csdn.net/batuwuhanpei/article/details/52354822 在吴恩达的课上,也曾经给出过一系列的选 ...
- svm常用核函数
SVM核函数的选择对于其性能的表现有至关重要的作用,尤其是针对那些线性不可分的数据,因此核函数的选择在SVM算法中就显得至关重要.对于核技巧我们知道,其目的是希望通过将输入空间内线性不可分的数据映射到 ...
- [白话解析] 深入浅出支持向量机(SVM)之核函数
[白话解析] 深入浅出支持向量机(SVM)之核函数 0x00 摘要 本文在少用数学公式的情况下,尽量仅依靠感性直觉的思考来讲解支持向量机中的核函数概念,并且给大家虚构了一个水浒传的例子来做进一步的通俗 ...
- 机器学习——支持向量机(SVM)之核函数(kernel)
对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...
- 机器学习:SVM(核函数、高斯核函数RBF)
一.核函数(Kernel Function) 1)格式 K(x, y):表示样本 x 和 y,添加多项式特征得到新的样本 x'.y',K(x, y) 就是返回新的样本经过计算得到的值: 在 SVM 类 ...
- 支持向量机 (二): 软间隔 svm 与 核函数
软间隔最大化(线性不可分类svm) 上一篇求解出来的间隔被称为 "硬间隔(hard margin)",其可以将所有样本点划分正确且都在间隔边界之外,即所有样本点都满足 \(y_{i ...
- SVM算法核函数的选择
SVM支持向量机,一般用于二分类模型,支持线性可分和非线性划分.SVM中用到的核函数有线性核'linear'.多项式核函数pkf以及高斯核函数rbf. 当训练数据线性可分时,一般用线性核函数,直接实现 ...
- 详解SVM模型——核函数是怎么回事
大家好,欢迎大家阅读周二机器学习专题,今天的这篇文章依然会讲SVM模型. 也许大家可能已经看腻了SVM模型了,觉得我是不是写不出新花样来,翻来覆去地炒冷饭.实际上也的确没什么新花样了,不出意外的话这是 ...
随机推荐
- CSS翻转小效果
CSS3翻转显示另外一张图: 1.backface-visibility:hidden;背面不可见 2.transform:rotate();旋转 (可以把图片换成本地图片看一下效果) <!DO ...
- netfilter 学习摘要
netfilter 子系入口在L3,完成后把数据包发往L4 netfilter 主要功能: 数据包选择(iptables) 数据包过滤 网络地址转换(NAT) 数据包操纵(在路由选择之前或之后修改数据 ...
- Python递归与迭代
1.递归与迭代: 递归和迭代都是循环的一种.简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结 ...
- 用elk+filebeat监控容器日志
elk 为 elasticsearch(查询搜索引擎),logstash(对日志进行分析和过滤,然后转发给elasticsearch),kibana(一个web图形界面用于可视化elasticsea ...
- Docker入门系列02
上篇用一个简单的示例,简单的介绍了 Dockerfile 的配置及其相关的命令.这一篇会在上篇的示例程序里,继续添加新代码及如何将单元测试也放入 Image 建立过程内. 首先,我们需要建一个新的类库 ...
- python--复习之路的目录
想要看时点链接看看,常来复习,温故而知新,可以为师矣. 1:基本类型 python--基本类型之字符串 python--基本类型之列表 python--基本类型之元组 python--基本类型之集合 ...
- 下载地图瓦片(包括各种格式的,Openstreetmap,googlemap, bingmap)
参考第三方开源库Brutile 个人的程序托管在github上
- python通过mongoengine中connect函数连接多个数据库
mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可. 可以通过switch_db切换到不同的数据库,进行读写操作,swi ...
- 北京Uber优步司机奖励政策(3月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承
公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 ...