SVM常用核函数

参考博客:
opencv SVM核函数模型选择
核函数(Kernel Function)与SVM

SVM核函数的选择对于其性能的表现有至关重要的作用,尤其是针对线性不可分的数据。核函数的作用是,通过将空间内线性不可分的数据映射到一个高维的特征空间,使得数据在特征空间内是可分的(动画)。我们定义这种映射为 ϕ(x),那么我们就可以把求解约束最优化问题变为

minα>12Ni=1Ni=1αiαjyiyj(ϕiϕj)Ni=1αi m i n α − − > 1 2 ∑ i = 1 N ∑ i = 1 N α i α j y i y j ( ϕ i ∗ ϕ j ) − ∑ i = 1 N α i

s.t.>Ni=1αiyi=0 s . t . − − > ∑ i = 1 N α i y i = 0

αi0,>i=1,2,...,N α i ≥ 0 , − − > i = 1 , 2 , . . . , N

但是由于从输入空间到特征空间的这种映射会使得维度发生爆炸式的增长,因此上述约束问题中内积(\phi_i*\phi_j)的运算会非常的大以至于无法承受,因此通常我们会构造一个核函数 κ(xi,xj)=ϕ(xi)ϕ(xj) κ ( x i , x j ) = ϕ ( x i ) ∗ ϕ ( x j ) 。从而避免了在特征空间内的运算,只需要在输入空间内就可以进行特征空间的内积运算。

通过上面的描述可知,构造核函数κ首先应确定输入空间到特征空间的映射,想要获取输入空间到映射空间的映射,我们需要明确输入空间内数据的分布情况,但大多数情况下,我们并不知道自己所处理的数据的具体分布,故一般很难构造出完全符合输入空间的核函数,因此我们常用如下几种常用的核函数来代替自己构造核函数:

  • 线性核函数 LINEAR

κ(x,xi)=xxi κ ( x , x i ) = x ∗ x i

线性核,主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少|速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。

  • 高斯径向基核函数 RBF

κ(x,xi)=exp(||xxi||2δ2) κ ( x , x i ) = e x p ( − | | x − x i | | 2 δ 2 )

高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。

  • 多项式核函数 POLY

κ(x,xi)=((xxi)+1)d κ ( x , x i ) = ( ( x ∗ x i ) + 1 ) d

多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。

  • 神经元的非线性作用核函数 Sigmoid

κ(x,xi)=tanh(η<x,xi>+θ) κ ( x , x i ) = t a n h ( η < x , x i > + θ )

采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。

因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证1的方法,来试用不同的核函数,误差最小的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。在吴恩达的课上,也曾经给出过一系列的选择核函数的方法:

  • 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM;
  • 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
  • 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。

  1. 交叉验证(Cross-validation)的基本思想是,将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。 ↩

你可能感兴趣的:(OpenCV,函数)