svmlib之svmtrain及svmpredict

Libsvm官方常见问题解答:https://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html

1. svmtrain

eg : model = svmtrain(heart_scale_label,heart_scale_inst, '-c 1 -g 0.07');

svmtrain函数返回的model可以用来对测试数据集进行预测。这是一个结构体变量,主要包括了以下几个域 : [Parameters, nr_class, totalSV, rho, Label, ProbA, ProbB, nSV,sv_coef, SVs]。英文说明如下:

       -Parameters: parameters

       -nr_class: number of classes; = 2 for regression/one-class svm

       -totalSV: total #SV

       -rho: -b of the decision function(s) wx+b

       -Label: label of each class; empty for regression/one-class SVM

       -ProbA: pairwise probability information; empty if -b 0 or in one-classSVM

       -ProbB: pairwise probability information; empty if -b 0 or in one-classSVM

       -nSV: number of SVs for each class; empty for regression/one-class SVM

       -sv_coef: coefficients for SVs in decision functions

       -SVs: support vectors

如果没有指定’-b 1’选项则ProbA和ProbB为空矩阵。此外,当指定’-v’选项时,返回的model是一个数值,是cross-validation的准确率。

其中model.paramter是一个5X1的向量,参数意义从上到下依次为:

-s svm类型:SVM设置类型(默认0)

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

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

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

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

2. svmpredict

        eg : [predict_label, accuracy, dec_values] =svmpredict(heart_scale_label, heart_scale_inst, model); 

svmpredict函数返回三个值,predict_label,是训练集预测得到的label向量。第二个输出是accuracy,是一个3维的向量,从上到下分别是:分类准率(分类问题中用到的参数指标);平均平方误差(MSE (mean squared error)) (回归问题中用到的参数指标);平方相关系数(r2 (squared correlation coefficient))(回归问题中用到的参数指标)。第三个输出是个矩阵,包含着决策值或者是概率估计(当’-b 1’被指定时)。当训练数据有k类时,决策值矩阵是一个n行k*(k-1)/2列的矩阵(n为测试数据集个数,k为类别数),而每一行的输出是k*(k-1)/2个二分类器的结果。当’-b 1’被指定时,概率估计矩阵是一个n行k类的矩阵(n为测试数据集个数,k为类别数),每一行的输出是该测试数据属于每个类的概率。


============================================================================================

libsvm工具箱同时实现了SVM与SVR。

1、支持向量机( SVM )是一种比较好的实现了结构风险最小化思想的方法。它的机器学习策略是结构风险最小化原则(为了最小化期望风险,应同时最小化经验风险和置信范围)
支持向量机方法的基本思想:
( 1 )它是专门针对有限样本情况的学习机器,实现的是结构风险最小化:在对给定的数据逼近的精度与逼近函数的复杂性之间寻求折衷,以期获得最好的推广能力;
( 2 )它最终解决的是一个凸二次规划问题,从理论上说,得到的将是全局最优解,解决了在神经网络方法中无法避免的局部极值问题;
( 3 )它将实际问题通过非线性变换转换到高维的特征空间,在高维空间中构造线性决策函数来实现原空间中的非线性决策函数,巧妙地解决了维数问题,并保证了有较好的推广能力,而且算法复杂度与样本维数无关。
目前, SVM 算法在模式识别、回归估计、概率密度函数估计等方面都有应用,且算法在效率与精度上已经超过传统的学习算法或与之不相上下。  
       对于经验风险R,可以采用不同的损失函数来描述,如e不敏感函数、Quadratic函数、Huber函数、Laplace函数等。
      核函数一般有多项式核、高斯径向基核、指数径向基核、多隐层感知核、傅立叶级数核、样条核、 B 样条核等,虽然一些实验表明在分类中不同的核函数能够产生几乎同样的结果,但在回归中,不同的核函数往往对拟合结果有较大的影响
2、支持向量回归算法
主要是通过升维后,在高维空间中构造线性决策函数来实现线性回归,用e不敏感函数时,其基础主要是 e 不敏感函数和核函数算法。
若将拟合的数学模型表达多维空间的某一曲线,则根据e 不敏感函数所得的结果,就是包括该曲线和训练点的“ e管道”。在所有样本点中,只有分布在“管壁”上的那一部分样本点决定管道的位置。这一部分训练样本称为“支持向量”。为适应训练样本集的非线性,传统的拟合方法通常是在线性方程后面加高阶项。此法诚然有效,但由此增加的可调参数未免增加了过拟合的风险。支持向量回归算法采用核函数解决这一矛盾。用核函数代替线性方程中的线性项可以使原来的线性算法“非线性化”,即能做非线性回归。与此同时,引进核函数达到了“升维”的目的,而增加的可调参数是过拟合依然能控制。

和罗斯蒂回归相比较,SVR在数据样本相对比较大的时候几乎是一个灾难,而罗斯蒂回归在数据的维度很大的时候是一个灾难。

http://www.jianshu.com/p/47808f18fd0f

http://blog.csdn.net/lpsl1882/article/details/52411987

3、SVR最回归在本质上类似于SVM,都有一个margin,只不过是这里的margin表示和SVM是不相同的,完全相反。在SVM中的margin是想把两个class分开,而这里SVR的margin是说:在margin里面的的数据是不会对对回归有任何的帮助,也就是没有贡献,说白了就是这里的数据我们认为他就是正确的,不用对margin里面的data进行惩罚。

4、把ultimateFrauto 那个工具包的SVMcgforClass等函数再加一个寻找核函数和分类器的类型,并且显示出来。我以前听一个香港理工大学做算法的教授讲座,他说做svm先要选择核函数,核函数决定能不能分类,然后才是调节参数,c和g决定分类效果。而且,我看很多用到svm的科研论文都会报告说用哪种核函数效果比较好。因为核函数和数据结构有关系。
此外,bestacc也不是很好的指标,一定要报告正例和反例的预测正确率才有用,如果正例占的比例是90%,那么,向量机即使没有一点分类能力,也能够得到90%的总正确率。但是,它在反例上的正确率必然是0,画ROC曲线就能发现。如果用信号检测论的公式计算,
区别能力D=|z(p(A))|+|z(p(B))|,即,正反两例的命中率的Z分数的绝对值之和,才是真正有用的指标。p是标准正态分布里的双侧检验概率。比如,Z(95%)=1.96,Z(5%)=-1.96.




============================================================================================

libsvm参数说明:

英文版说明

libsvm_options:
-s svm_type : set type of SVM (default 0) ======前两个是分类的,2是做分布概率问题,后两个是回归。各自的区别在于目标函数
        0 -- C-SVC
        1 -- nu-SVC
        2 -- one-class SVM
        3 -- epsilon-SVR
        4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
        0 -- linear: u'*v
        1 -- polynomial: (gamma*u'*v + coef0)^degree
        2 -- radial basis function: exp(-gamma*|u-v|^2)
        3 -- sigmoid: tanh(gamma*u'*v + coef0)
        4 -- precomputed kernel (kernel values in training_instance_matrix)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/k)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n: n-fold cross validation mode

注意:当使用-v参数时,svmtrain返回的model不再是一个结构体,

分类问题下返回的是交叉验证下的平均分类准确率,

回归问题下返回的是交叉验证下的平均mse(均方根误差)。-----表达式见下方图片
==========================================================
中文版说明
Options:可用的选项即表示的涵义如下
  -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
  其中-g选项中的k是指输入数据中的属性数(类别数)。

       option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。


============================================================================================

1、model参数说明    Ref: http://www.matlabsky.com/thread-12649-1-1.html

model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 259
           rho: 0.0514
         Label: [2x1 double]
         ProbA: []
         ProbB: []
           nSV: [2x1 double]
       sv_coef: [259x1 double]
           SVs: [259x13 double]

1)、model.Parameters参数意义从上到下依次为:
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

2)、

model.Label表示数据集中类别的标签都有什么,这里是 1,-1;
model.nr_class表示数据集中有多少类别,这里是二分类。

3)、

model.totalSV代表总共的支持向量的数目,这里共有259个支持向量;
model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有118个,标签为-1的样本的支持向量为141。
注意:这里model.nSV所代表的顺序是和model.Label相对应的。

4)、

model.ProbA 和 model.ProbB 使用-b参数时才能用到,用于概率估计。-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)

5)、

model.sv_coef是一个259*1的矩阵,承装的是259个支持向量在决策函数中的系数;
model.SVs是一个259*13的稀疏矩阵,承装的是259个支持向量。
model.rho是决策函数中的常数项的相反数(-b)

=======最终的决策函数g(x) = sign(sigma(wi*K(xi,x)) + b, 当使用RBF函数时,决策函数变为g(x) = sign(sigma(wi*exp(-gamma*||xi-x||^2))) + b

其中||xi-x||是二距离范数。

b就是-model.rho(一个标量数字);
b = -model.rho;
n代表支持向量的个数即 n = model.totalSV(一个标量数字); 
对于每一个i:
wi =model.sv_coef(i); 支持向量的系数(一个标量数字);wi即alpha向量与类别向量的乘积
xi = model.SVs(i,:) 支持向量(1*13的行向量)
x 是待预测标签的样本 (1*13的行向量)
gamma 就是 -g 参数

===================================

返回参数accuracy从上到下依次的意义分别是:
分类准率(分类问题中用到的参数指标)
平均平方误差(MSE (mean squared error)) [回归问题中用到的参数指标]
平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]


在libsvm中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装。

==================================================

在回归问题中,

问题解析:

1)、label (1st argument) should be a vector (# of column is 1).

     在调用svmpredict的时候出现这个错误。原因是predictdata和predicty的列数不为1.

2)、Error : C >= 0 ,model must be a struct

     在调用svmtrain的时候出现这个错误。原因是svmtrain的libsvm_options参数中,如-c bestc,应该为-c str2num(bestc)。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值