zoukankan      html  css  js  c++  java
  • libSVM简介及核函数模型选择

    1. libSVM简介

    训练模型的结构体

    struct svm_problem //储存参加计算的所有样本

    {

    int l//记录样本总数

    double *y//指向样本类别的组数

    struct svm_node **x;//数据样本

    };

    当样本类别事先已经被告知时,可以通过数字来给样本数据进行标识(如果是两类通常以1-1来表示)。如果不清楚样本类别可以用样本个数编号来设置,这时候分类的准确率也就无法判定了。

    数据样本是一个二维数组,其中每个单元格储存的是一个svm_nodey与样本数据的对应关系为:

    数据节点的结构体

    struct svm_node //储存单一向量的单个特征

    {

          int index; //索引

          double value; //

    };

    如果需要储存向量x=(1,121,12321,121,1),就可以使用6svm_node来保存,内存映像为:

    index

            1   

         2

             3

            4

         5

        -1

    value

           1

       121

          12321

          121

          1

       NULL

    注意:向量是以索引值为-1的元素为结束标志位的。如果没有标志位将导致程序崩溃。

    SVM模型类型枚举

    enum { C_SVCNU_SVCONE_CLASSEPSILON_SVRNU_SVR };

     C_SVCC表示惩罚因子,C越大表示对错误分类的惩罚越大

     NU_SVC:和C_SVC相同。

     ONE_CLASS:不需要类标号,用于支持向量的密度估计和聚类.

     EPSILON_SVR:-不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域,即-带。

     NU_SVR:由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数

    注意:C_SVCNU_SVC其实采用的模型相同,但是它们的参数C的范围不同,C_SVC采用的是0到正无穷,NU_SVC[0,1]

    核函数类型枚举

    enum { LINEARPOLYRBFSIGMOIDPRECOMPUTED }; 

     LINEAR:线性核函数(linear kernel

     POLY:多项式核函数(ploynomial kernel

     RBF:径向机核函数(radical basis function)

     SIGMOID: 神经元的非线性作用函数核函数(Sigmoid tanh)

     PRECOMPUTED:用户自定义核函数

    只有四个常用核函数,但我们必须决定哪一个是首选。然后是惩罚因子C和核参数的选择。

    在支持向量机中使用的核函数主要有四类:

    线性核函数:
    多项式核函数:
    RBF核函数:
    Sigmoid核函数:

    其中, 和 均为核参数。

    究竟用哪一种核函数取决对数据处理的要求,不过建议一般都是使用RBF核函数。因为RBF核函数具有良好的性态,在实际问题中表现出了良好的性能。

    1 RBF核
            通常而言,RBF核是合理的首选。这个核函数将样本非线性地映射到一个更高维的空间,与线性核不同,它能够处理分类标注和属性的非线性关系。并且,线性核 是RBF的一个特例(Keerthi and Lin 2003),因此,使用一个惩罚因子C的线性核与某些参数(C,γ)的RBF核具有相同的性能。同时,Sigmoid核的表现很像一定参数的RBF核 (Lin and Link 2003)。
            第二个原因,超参数(hyperparameter)的数量会影响到模型选择的复杂度(因为参数只能靠试验呀!)。多项式核比RBF核有更多的超参数。
    最后,RBF核有更少的数值复杂度(numerical difficulties)。一个关键点0<Kij<=1对比多项式核,后者关键值需要 infinity(rxiTxj+r>1)或者zero(rxiTxj+r<1),这是高阶运算。此外,我们必须指出sigmoid核在某些 参数下不是合法的 (例如,不是两个向量的内积)。(Vapnik 1995)
    当然,也存在一些情形RBF核是不适用的。特别地,当特征维数非常大的时候,很可能只能适用线性核。 

    • svm_type –

      指定SVM的类型,下面是可能的取值:

      • CvSVM::C_SVC C类支持向量分类机。 n类分组  (n geq 2),允许用异常值惩罚因子C进行不完全分类。
      • CvSVM::NU_SVC 
u类支持向量分类机。n类似然不完全分类的分类器。参数为 
u 取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
      • CvSVM::ONE_CLASS 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
      • CvSVM::EPS_SVR epsilon类支持向量回归机训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
      • CvSVM::NU_SVR 
u类支持向量回归机。 
u 代替了 p
    • kernel_type –

      SVM的内核类型,下面是可能的取值:

      • CvSVM::LINEAR 线性内核。没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。K(x_i, x_j) = x_i^T x_j.
      • CvSVM::POLY 多项式内核: K(x_i, x_j) = (gamma x_i^T x_j + coef0)^{degree}, gamma > 0.
      • CvSVM::RBF 基于径向的函数,对于大多数情况都是一个较好的选择: K(x_i, x_j) = e^{-gamma ||x_i - x_j||^2}, gamma > 0.
      • CvSVM::SIGMOID Sigmoid函数内核:K(x_i, x_j) = 	anh(gamma x_i^T x_j + coef0).
    • degree – 内核函数(POLY)的参数degree。
    • gamma – 内核函数(POLY/ RBF/ SIGMOID)的参数gamma
    • coef0 – 内核函数(POLY/ SIGMOID)的参数coef0
    • Cvalue – SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C
    • nu – SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 
u
    • p – SVM类型(EPS_SVR)的参数 epsilon
    • class_weights – C_SVC中的可选权重,赋给指定的类,乘以C以后变成 class\_weights_i * C。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
    • term_crit – SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。

    http://blog.csdn.net/liulina603/article/details/8552424

  • 相关阅读:
    Dubbo的使用入门
    Centos7安装Tomcat并部署DubboAdmin的War包并配置自动启动
    JPA中自动使用@Table(name = "userTab")后自动将表名、列名添加了下划线的问题
    JAVA和C#检测IP地址段是否交叉和获取地址段IP列表的方法
    MySQL中的insert ignore into, replace into用法总结
    SpringBootWEB项目和非Web项目的全局异常捕获
    SpringBoot中配置起动时的数据库初始化角本
    树莓派中编译Opencv3.4.1和OpenCVSharp库
    树莓派简单摄像头录像并保存视频文件
    树莓派中编译OpenCV3.4.1和OpenCvSharp
  • 原文地址:https://www.cnblogs.com/549294286/p/3301124.html
Copyright © 2011-2022 走看看