支持向量机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