zoukankan      html  css  js  c++  java
  • Libsvm在matlab环境下使用指南

     

    一、安装

    http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/。在这个地址上可以下的包含matlab接口的源程序。下载完后可以放到放到任意的盘上解压,最好建一个专门来放matlab程序的文件夹。打开matlab,在matlab的面板上找到set path选项(不同版本不一样R2010b在file菜单下),将刚下载的libsvm整个目录都添加到matlab的搜索路径里。然后将当前路径定位到libsvm/matlab目录下(在current floder(matlab界面中间上方可以设置))。如果你的电脑是64位一般不需要编译生成mex文件,因为文件已经提前编译好了。如果是32位的话,那么需要点击make.m文件运行编译生成mex文件。这一步有可能不成功,可以输入mex-setup查看选择C++编译器,如果找不到编译器,那么下载安装visual studio。成功编译完成后,在任意的matlab程序中都可以使用libsvm了。

    二、使用

    在使用之前,要对libsvm做一个了解,而最好的资料自然是libsvm种README文件了。README文件包含了介绍,安装,SVM返回的模型参数,以及例子等。Libsvm主要用了两个函数svmtrain,svmpredict,如果你在用的时候忘了具体的参数,可以在matlab命令提示符下输入函数名就有相关的提示。

    用法:1.model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

    1training_label_vector, training_instance_matrix

    training_label_vector和training_instance_matrix就是要训练的标签和特征了。training_label_vector一般以列向量的形式存放的,每个元素即每行代表一个instance(一般是特征)的标签。而training_instance_matrix也类似每行代表一个instance.

     clip_image001

    如图所示,上面变量代表有930个instance来训练,每个instance1116维,下面是对于instance的标签。

    (2)Libsvm_options

    怎么选择呢?libsvm_options:重要的是-t,以及交叉验证时的-v

    -s svm类型:SVM设置类型,一般默认0不用设置

    0 -- C-SVC(多类分类) 1 --v-SVC(多类分类) 2 –一类SVM 3 -- e –SVR 4 -- v-SVR

    -t 核函数类型:核函数设置类型(默认2)

    0 –线性:u'v 1 –多项式:(r*u'v + coef0)^degree 2 – RBF函数:exp(-gamma|u-v|^2)

    3 –sigmoid:tanh(r*u'v + coef0)

    -d degree:核函数中的degree设置(针对多项式核函数)(默认3)

    -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)

    -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

    -c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)

    -n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)

    -p p:设置e -SVR 中损失函数p的值(默认0.1)

    -m cachesize:设置cache内存大小,以MB为单位(默认40)

    -e eps:设置允许的终止判据(默认0.001)

    -h shrinking:是否使用启发式,0或1(默认1)

    -wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)

    -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

    (3)返回的model

    clip_image002

    如上图 -Parameters: 参数。

    -nr_class: 类的数目。

    -totalSV:总的支持向量数目。

    -rho: -判决函数wx+b的b。

    -Label: 每个类的标签。

    -ProbA: 成对的概率信息,如果b是 0则为空。

    -ProbB: 成对的概率信息,如果b是 0则为空。

    -nSV: 每个类的支持向量

    -sv_coef:判决函数的系数

    -SVs:支持向量。

    如果指定了'-v',那么就实施了交叉验证,而且返回是交叉验证的正确率。

    用法:

    2. [predicted_label, accuracy, decision_values/prob_estimates] = svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

    (1)esting_label_vector, testing_instance_matrix

    类似于svmtrain

    (2)libsvm_options

    -b 概率估计:默认0,1表示估计。(需要在使用时显式表现)

    (3)predicted_label, accuracy, decision_values/prob_estimates:

    predicted_label: SVM 预测输出向量。类似于输入的label

    accuracy: 向量包括正确率,均方误差,方相关系数.

    decision_values:每行是预测k(k-1)/2二类SVMs的结果

    prob_estimates: 每行包括k个值代表每类中测试数据所占的概率。

    三、核函数

    核函数的image 目的是将特征向量映射到高维空间。SVM通过在高维空间寻找最大的间距的分类超平面。

    核函数总共有以下4种,我们要了解在什么情况下用哪一种核函数。

    image

    一般情况下,首选RBF核,它能够把样本以非线性的方式映射到高维空间,所以能够处理类标签和特征不是线性关系的情况。线性核只是RBF的一种特殊情况。

    但是有些情况下RBF核并不适用,比如特征的数量特别大的时候,一般仅仅使用线性核。

    四、调参-交叉验证和网格搜索

       RBF核中有两个参数需要确定 image 。我们并不知道怎么样的image是最适用于给定的问题的。最常用的方式就是交叉验证即把训练的数据分成两部分,把一部分当成知道的,另一部分是不知道的。比如在v-fold 交叉验证中,先把训练数据分成v个相同大小的子集。然后用v-1子集的训练数据训练分类器,用剩下一个子集来测试分类器。交叉验证能够解决过拟合的问题。要怎么利用交叉验证来选取最好的image呢?一般是利用网格搜索,己将image组成的坐标系分成一系列网格。然后用网格上点(即对于一个个image)做交叉验证,取使最后交叉验证的正确率最高的参来做为最终的参数。

    ps:什么时候用RBF,什么时候用线性核

    1.样本数量远远小于特征数时

    比如训练和测试数据有二三十个而特征维数有好几千时,采用线性核是最好的,不需要映射数据。

    2.样本数量和特征数都非常大时

    可以利用另一工具箱LIBLINEAR,或者用线性核

    3.样本数量远远大于特征数时

    用非线性核是最好的了。

    参考文献:http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/dawnminghuang/p/3825229.html
Copyright © 2011-2022 走看看