Kernel函数

上一章结束的时候讲到SVM在做优化的时候要计算znTzm这一项,这里还要受到VC dimension的约束,同时计算的时候,我们先要把xn扩展到高阶项,然后相应的计算,这一项计算比较耗费时间,下面就介绍能够更快计算这一项的方法。

以二阶项为例子,上述的式子可以用上述的形式进行化简,这样计算的时候只要先求xTx的值,那么就可以在xTx的基础上进行相应的计算,这样就把时间复杂度从O(d^2)降到了O(d)。

接下去就是利用二次项的Kernel Function把qn,m, b, gsvm表示出来,由于项中已经把VC dimension隐去了,所以这里就避免了对d的依赖。我们利用Kernel对SVM求解的过程如下图所示。

通常在实际应用的时候,我们对x加上一定的系数,使其能化成完全平方式,这样计算起来更容易,同时加入了一个系数,可以更灵活地进行调节。

上图就是系数不同的时候,训练得到的SV也不一样,这里K值越大,那么对Margin的要求也是越大,所以造成了不同的SV点。关于K值的确定就是一个Hyperparameter确定的过程,一般要通过Validation,比如Cross-Validation的过程来确定.

当Q的阶次增加,那么训练的过程就会得到更为复杂的边界,但是要避免Overfit的发生。

线性的Kernel是一个特殊的例子,该计算很快,很容易,我们往往从该Kernel开始进行计算。

接下去介绍的这种Kernel把Xn的维度扩展到无限维,但是计算起来确很方便。那就是Gaussian Kernel

Gaussian Kernel的物理意义可以看作是以在SVs为中心的点上高斯展开的线性组合,所以也可以称作是Radial Basis Function。

Gaussian SVM可以看作是无限维度上的线性组合,同时通过large-margin的参数来保证其具有泛化的能力。

下图的第三幅图SVM明显Overfit了.

Linear Kernel的优点是简单,计算快速,容易解释,但是训练对象并不是总是线性可分的。

Polynomial Kernel就比Linear Kernel更少的约束,但是当Q很大的时候,Kernel Function的计算在数值上容易产生误差,同时三个参数来调节起来也比较麻烦。

Gaussian Kernel是最强大的Kernel,因为exp函数是有阶的,所以数值上计算没有Poly那么麻烦,只有一个参数,调节的时候也很方便,但是由于是无限维上的展开,没有w,所以解释上并不那么直观,参数的选取的时候也要考虑Overfit的情况。

构成Kernel的充要条件,需要半正定的。

知乎上这个回答解释半正定矩阵还是很有意思的:

https://www.zhihu.com/question/22098422

时间: 2024-12-31 10:20:26

Kernel函数的相关文章

向Kernel函数传递thrust vector的方法

废话不说,直接上代码 C/C++ code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 __global__  void Kernel(int* dv) {     int i = threadIdx.x;     dv[i] = i; } int main() {     thrust::device_vector<int> dv(10);          Kernel<<<1,10>&g

CUDA学习,第一个kernel函数及代码讲解

前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个kernel函数. 一.代码示例 二.代码解说 申明一个函数,用于检测CUDA运行中是否出错. kernel函数,blockIdx.x表示block在x方向的索引号,blockDim.x表示block在x方向的维度,threadIdx.x表示thread在x方向的索引号. 这里也许你会问,为什么在x方

CUDA 7 ---- Kernel性能调节

Exposing Parallelism 这部分主要介绍并行分析,涉及掌握nvprof的几个metric参数,具体的这些调节为什么会影响性能会在后续博文解释. 代码准备 下面是我们的kernel函数sumMatrixOnGPUD: __global__ void sumMatrixOnGPU2D(float *A, float *B, float *C, int NX, int NY) { unsigned int ix = blockIdx.x * blockDim.x + threadIdx

SVM2---核函数的引入

前边总结了线性SVM,最终转化为一个QP问题来求解.后来又考虑到非线性SVM,如果特征特别特别多的话,直接使用QP的话求解不了,我们经过一系列的转化,把这一问题转化为训练集大小n量级的QP问题. http://www.cnblogs.com/futurehau/p/6143178.html 在之前的基础之上,我们继续学习,引入核函数的概念,完全避免了特征数目量级的计算问题.接下来依次分析polynomial Kernel, Gaussian Kernel,并对他们进行对比分析. 一.Kernel

opencl:提高kernel有效并发约束(Effective concurrency constraint)的一点心得

下面是一个简单的kernel函数,从integ_count_mat矩阵中用vload8函数取出A1,A2,A3,A4四个向量执行A4+A1-A2-A3,结果存入density_mat,代码中只用到了一个向量类型的变量sum. __kernel void object_density_filter( matrix_info_cl im_info , const __global ushort *integ_count_mat , matrix_info_cl om_info , __global

CUDA核函数参数示意:Kernel&lt;&lt;&lt;Dg,Db, Ns, S&gt;&gt;&gt;(param list)

核函数是GPU每个thread上运行的程序.必须通过__gloabl__函数类型限定符定义.形式如下: __global__ void kernel(param list){  } 核函数只能在主机端调用,调用时必须申明执行参数.调用形式如下: Kernel<<<Dg,Db, Ns, S>>>(param list); <<<>>>运算符内是核函数的执行参数,告诉编译器运行时如何启动核函数,用于说明内核函数中的线程数量,以及线程是如何

OpenCL入门:(二:用GPU计算两个数组和)

本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201  (英文版) http://www.cnblogs.com/leiben/archive/2012/06/05/2536508.html (博友翻译的中文版) 一.创建工程 按照OpenCL

PCA原理(转)

PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维.网上关于PCA的文章有很多,但是大多数只描述了PCA的分析过程,而没有讲述其中的原理.这篇文章的目的是介绍PCA的基本数学原理,帮助读者了解PCA的工作机制是什么. 当然我并不打算把文章写成纯数学文章,而是希望用直观和易懂的方式叙述PCA的数学原理,所以整个文章不会引入严格的数学推导.希望读者在

Android高效计算——RenderScript(二)

3 RenderScript运行时层与反射层 3.1 RenderScript运行时层 RenderScript运行时层是指.rs代码运行时所在的层级.当对安卓项目进行编译的时候,.rs或者.rsh中编写的代码都会被llvm编译器编译成字节码.当该安卓应用在设备上运行的时候,这些字节码将会被设备上另外一个llvm编译(just-in-time)成机器码.这些机器码是针对该设备进行了优化的,且缓存在设备上,等到下次被应用的时候就不需要重新编译了,以加快速度.虽然RenderScript运行时层很像