【神经网络学习笔记】LIBSVM参数讲解

支持向量机SVM(Support Vector Machine)作为一种可训练的机器学习方法可以实现模式分类和非线性回归,本文就matlab中的LIBSVM工具箱展开说明。

在matlab中调用LIBSVM工具箱可以方便的使用LIBSVM网络,台湾大学的林智仁教授已经封装好各方法,大家可以在此下载。

LIBSVM工具箱的主要函数为svmtrain和svmpredict,调用格式为


model = svmtrain(train_lable,train_data,options);

[predict_lable,accuracy/mse,dec_value] = svmpredict(test_lable,test_data,model);


svmtrain:

train_lable:训练标签

train_data:训练数据

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类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。


下面用一个例子来解释各参数,使用LIBSVM工具箱自带的heart_scale.mat数据(共270个样本,每个样本有13个属性)

%% A Little Clean Work
clear;
clc;
close all;
format compact;
%%
% 首先载入数据
load heart_scale;
data = heart_scale_inst;
label = heart_scale_label;
% 建立分类模型
model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
% 利用建立的模型看其在训练集合上的分类效果
[PredictLabel,accuracy,dec_value1] = svmpredict(label,data,model);
accuracy

%% 分类模型model解密
model
Parameters = model.Parameters
Label = model.Label
nr_class = model.nr_class
totalSV = model.totalSV
nSV = model.nSV 

运行结果:

Accuracy = 99.6296% (269/270) (classification)
accuracy =
   99.6296
    0.0148
    0.9851
model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 259
           rho: 0.0514
         Label: [2x1 double]
    sv_indices: [259x1 double]
         ProbA: []
         ProbB: []
           nSV: [2x1 double]
       sv_coef: [259x1 double]
           SVs: [259x13 double]
Parameters =
         0
    2.0000
    3.0000
    2.8000
         0
Label =
     1
    -1
nr_class =
     2
totalSV =
   259
nSV =
   118
   141

这里为了简单起见没有划分训练集和测试集,下面探究一下各个参数的意义

1、model.parameters

Parameters =
         0
    2.0000
    3.0000
    2.8000
         0

从上到下依次是

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

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

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

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

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

参数数字的意义见上。

2、model.label  model.nr_class

Label =
     1
    -1
nr_class =
     2

model.label表示数据集中类别的标签都有哪些,这里是1和-1

model.nr_class表示数据集中一共有多少个类别,这里是二分类

3、model.totalSV   model.nSV

totalSV =
   259
nSV =
   118
   141

model.totalSV 代表总共的支持向量的数目,这里共259个支持向量

model.nSV 每类标签的支持向量数,这里标签为1的支持向量有118个,-1的有141个。

4、model.sv_coef   model.SVs   model.rho

model.sv_coef承装的是259个支持向量杂决策函数中的系数

 model.SVs 承装259个支持向量

model.rho 决策函数中常数项的相反数


通过model提供的信息,可以建立上面的决策函数,代码实现如下:

%% DecisionFunction
function plabel = DecisionFunction(x,model)

gamma = model.Parameters(4);
RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );

len = length(model.sv_coef);
y = 0;

for i = 1:len
    u = model.SVs(i,:);
    y = y + model.sv_coef(i)*RBF(u,x);
end
b = -model.rho;
y = y + b;

if y >= 0
    plabel = 1;
else
    plabel = -1;
end
有了这个决策函数就可以自己预测样本标签了

%%
plable = zeros(270,1);
for i = 1:270
    x = data(i,:);
    plabel(i,1) = DecisionFunction(x,model);
end

LIBSVM官方网站有关matlab接口的FAQ地址: www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html

你可能感兴趣的:(SVM,神经网络)