SVM分类器-libsvm(三)

时间:2022-12-08 08:18:21

   Libsvm工具箱的使用:

   一、安装Libsvm

    下载libsvm,然后安装即可,可以参考http://blog.csdn.net/ahuang1900/article/details/8971991。.之后得到4个文件,分别是:libsvmread.mex,libsvmwrite.mex,svmtrain.mex,svmpredict.mex,需要注意:我的是在xp下载安装的,在win7 32为的系统,得到的文件后缀为mexw32。

    函数说明:

     (1)libsvmread:用于读取libsvm格式的文件,’data.txt'中包含的数据是libsvm格式

         使用格式:[label_vector, instance_matrix] = libsvmread('data.txt'); 

输出:1.label_vector:标签向量

      2.instance_matrix:实例矩阵(是一个稀疏矩阵)

原始数据如下:

SVM分类器-libsvm(三)

       使用libsvm数据格式为:标签 属性(x1)编号1:数据 属性(x2)编号2:数据 属性(x3)编号3:数据 ... 属性(xn)编号n:数据 

      上面的数据可以表示为如下:

SVM分类器-libsvm(三)

   (2)libsvmwrite:用于一个matlab的矩阵libsvm格式的数据,写入到data.txt中,用法:

    libsvmwrite('data.txt', label_vector, instance_matrix),其中instance_matrix是必须是稀疏矩阵(double型)

例如,假设有矩阵M=  [1   2 ;  3   4 ],标签矩阵为label = [1;-1]               

利用 sparse函数,把M表示稀疏矩阵形式,

M =

     1     2
     3     4

>> M=sparse(M)

M =

   (1,1)        1
   (2,1)        3
   (1,2)        2
   (2,2)        4

这样通过  libsvmwrite('data.txt', label, M),即可得到libsvm格式的数据data.txt


M =

   (1,1)        1
   (2,1)        3
   (1,2)        2
   (2,2)        4

>> label

label =

     1
    -1

>> libsvmwrite('data.txt', label,M)


data.txt的内容为:
1 1:1 2:2
-1 1:3 2:4

   (3)svmtrain:用于根据训练样本训练一个svm分类器,用法:(svmtrain方程返回的model用于将来预测)

  model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

 其中, -training_label_vector:  % An m by 1 vector of training labels (type must be double). (标签是一个m*1的矩阵)
        -training_instance_matrix:   %An m by n matrix of m training instances with n features. It can be dense or sparse (type must be double).(m是训练样本的总数,n是样本的特征个数)(矩阵数据要么是稠密矩阵,要么是稀疏矩阵)
        -libsvm_options:    A string of training options in the same format as that of LIBSVM

   (4)svmpredict:根据训练好的svm分类器,进行预测的函数,用法:

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

其中,

-testing_label_vector:  An m by 1 vector of prediction labels. If labels of test data are unknown, simply use any random values. (type must be double)(测试样本的标签,是一个m*1的矩阵,m是测试样本的总数)(如果测试数据的标签位置,简单的使用随机值)

-testing_instance_matrix: An m by n matrix of m testing instances with n features.It can be dense or sparse. (type must be double)(测试样本是一个m*n的矩阵,其中m是测试样本的总数,n是样本的特征数)(测试矩阵要么是稠密,要么是稀疏矩阵)
-model: The output of svmtrain.(通过svmtrain训练得到svm分类器模型)
-libsvm_options: A string of testing options in the same format as that of LIBSVM.

输出:

1-predictd_label:预测标签向量

2-accuracy:是一个向量【分类的精度accuracy(针对分类),均方误差mean
squared error,以及平方相关系数squared correlation coefficient(针对回归)】

3.-是一个矩阵(包含decision values 或者 probability estimates(if '-b 1'时) ),如果k是训练样本中类的数量,对于决策值,每行包含了预测k(k-1)/2的二分类SVMs的结果。对分类而言,k=1是特殊的情形。决策值+1对于每个测试样本,而不是空向量。对于probabilities,每行包含k值,表明了测试用例在每一个类中的概率。


   (5)svm的model

下面介绍svm的model结构有域:[Parameters, nr_class,totalSV, rho, Label, ProbA, ProbB, nSV, sv_coef, SVs],这些参数是通过训练得到的。

其中,

        -Parameters: parameters 是什么参数呢?%5x1的向量,其实这个参数就是我们设置的参数
        -nr_class: number of classes(类的个数); = 2 for regression/one-class svm
        -totalSV: total #SV %支持向量的个数
        -rho: -b of the decision function(s) wx+b %决策函数的b
        -Label: label of each class(每一类的标签); empty for regression/one-class SVM
        -ProbA: pairwise probability information; empty if -b 0 or in one-class SVM
        -ProbB: pairwise probability information; empty if -b 0 or in one-class SVM
        -nSV: number of SVs for each class(每一类中支持向量的个数); empty for regression/one-class SVM
        -sv_coef: coefficients for SVs in decision functions %决策函数中支持向量的系数
        -SVs: support vectors %支持向量,

(6)svm的libsvm_options

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

   1. SVC: support vector classi cation (two-class and multi-class).

   2. SVR: support vector regression.
  0 -- C-SVC(支持向量分类):C-support vector classi cation(通常说的svm,Boser et al,1992,Cortes and Vapnik,1995)

   C就是那个惩罚因子,也称:regularization parameter(规则化参数),需要用户预设。

  1 --v-SVC(nu-SVC):v-support vector classi cation(Scholkopf et al,2000,引入了一个新的参数v属于(0,1])
  2 – 一类SVM( one-class SVM):distribution estimation(Scholkopfet al,2001,用于估计高维分布的支持),
  3 -- e -SVR(epsilon-SVR)(支持向量回归):e-support vector regression(Vapnik,1998)
  4 -- v-SVR(nu-SVR):v-support vector regression(Scholkopf et al,2000,类似于e-SVR,使用了参数v属于(0,])来控制支持向量)

  -t kernel_type核函数类型:核函数设置类型(默认2)
  0 – 线性:u'*v
  1 – 多项式:(r(gamma)*u'*v + coef0)^degree
  2 – RBF函数:exp(-r(gamma)*|u-v|^2) 
  3 –sigmoid:tanh(r(gamma)*u'*v + coef0)

    4 - precomputed kernel (kernel values in training_instance_matrix)

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

  -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
  -c cost:设置C-SVC,e-SVR(epsilon-SVR)和v-SVR(nu-SVR)的参数(损失函数)(默认1)
  -n nu:设置v-SVC(nu-SVC),一类SVM(one-class SVM)和v-SVR(nu-SVR)的参数(默认0.5)
  -p epsilon:设置e-SVR(epsilon-SVR)中损失函数epsilon的值(默认0.1)
  -m cachesize:设置cache内存大小,以MB为单位(默认 100)
  -e eps:设置允许的终止判据(默认0.001)
  -h shrinking:是否使用启发式(whether to use the shrinking heuristics),0或1(默认1)
  -b probability_estimates:whether to train a SVC(0) or SVR(1) model for probability estimates, 0 或 1 (默认0)

   (如不用-b 1,那么ProbA和ProbB都为空矩阵)

   -wi weight:设置类i的参数C为weight*C(C-SVC中的C)(默认1) (set the parameter C of class i to weight*C, for C-SVC (default 1))
  -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2,( n-fold cross validation mode)

   (如果-v项被指定,交叉验证被进行,并返回一个值:交叉验证精度和回归的均方误差)

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

   二、相关matlab函数

sparse函数,用于创建稀疏矩阵

使用方法:

S = sparse(A)

  A=  1     2
      3     4

>> B=sparse(A)

B =

   (1,1)        1
   (2,1)        3
   (1,2)        2
   (2,2)        4

使用full函数还原为矩阵形式

>> C=full(B)

C =

     1     2
     3     4


S = sparse(i,j,s,m,n,nzmax)
S = sparse(i,j,s,m,n)
S = sparse(i,j,s)
S = sparse(m,n)

   三、使用Libsvm

 下面是libsvm的reade中的例子:

 对于probability estimates,需要设置 '-b'来用于训练和测试

测试1

(1)训练svm分类器:

%目的:使用libsvm
%第一步:训练
%从heart_scale中读取数据
%heart_scale_label:270x1的标签向量(+1和-1的向量)
%heart_scale_inst: 270x13的稀疏矩阵(270是样本个数,13是特征个数)
[heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale');
%根据训练样本,训练svm分类器,
%其中'-c'是cost(就是损失函数参数),
%-g 设置核函数中的gamma函数
%参数设置: '-s 0 -t 1  -d 10 -c 25 -g 50  -r 180'
model = svmtrain(heart_scale_label, heart_scale_inst, '-s 0 -t 1  -d 10 -c 25 -g 50  -r 180');


这里的 model就是训练分类器的结果,其中model如下所示。

SVM分类器-libsvm(三)


图1 model的结果

我们可以看到:SVs是支持向量,我们看到这里得到130个支持向量;支持向量对应的系数为sv_coef,每个向量都对应一个;

nSV表示每一类对应有几个支持向量,由于nSV=[63;67],又63+67=130,很明显类1(+1)有63个支持向量,类2(-1)有67个支持向量

sv_indices表示每个支持向量在元素数据中的位置。

Label:类标签;

rho:就是决策函数wx+b中的b(-0.6152)

totalSV:支持向量的总个数(154);

nr_class:类的个数(2)

Parameters:就是我们需要设置的那些参数,从这里设置来看Parameter=[0(-s);1(-t);10(-d);50(-g);180(-r)]

(2) 测试(这里使用训练样本进行测试)

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

   结果:

Accuracy = 86.6667% (234/270) (classification)
>> 

   四、关于libsvm的相关理论

   1.C-Support Vector Classification(c-svn)(Boser et al,1992, Cortes and Vapnik, 1995)

   原问题:

SVM分类器-libsvm(三)

 对偶问题:

         SVM分类器-libsvm(三)

在对偶问题解决后,w为:

                                                          SVM分类器-libsvm(三)

当一个新的样本x进来是,决策函数为:

SVM分类器-libsvm(三)       

                

2.v-Support Vector Classification(v-svn)(Scholkopfet et al, 2000)

    v属于(0,1]

   原问题:

                        SVM分类器-libsvm(三) 

对偶问题:

      SVM分类器-libsvm(三)            

   五、小结

SVM 怎样能得到好的结果

1.    对数据做归一化(simple scaling

2.    应用 RBF kernel

3.    cross-validationgrid-search得到最优的cg

4.    用得到的最优cg训练训练数据

5.    测试

参考:libsvm参数说明

参考:libsvm--svmtrain\svmpredict函数说明

参考:百度文库