LibSVM学习2:Libsvm工具箱参数实例详解

原文地址:
libsvm 参数说明【中英文双语版本】
http://www.matlabsky.com/thread-12380-1-1.html
交叉验证(Cross Validation)方法思想简介
http://www.matlabsky.com/thread-10567-1-1.html
libsvm如何使用自定义核函数[有关-t 4 参数的使用例子]
http://www.matlabsky.com/thread-15296-1-1.html

视频:
http://player.youku.com/player.php/sid/XMjgzMTgxOTM2/v.swf

【1】libsvm 参数说明【中英文双语版本】

English:
libsvm_options:
-s svm_type : set type of SVM (default 0)
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

Chinese:
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类型中没有也不会产生影

响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

【2】交叉验证(Cross Validation)方法思想简介
交叉验证(CrossValidation)方法思想简介

以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下:

1).Hold-Out Method

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.

2).K-fold Cross Validation(记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.

3).Leave-One-Out Cross Validation(记为LOO-CV)

如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:


a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。


b.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.

【3】libsvm如何使用自定义核函数[有关-t 4 参数的使用例子]

此帖子主要讲解一下如何使用libsvm工具箱中的自定义核函数,即关于 -t 4 参数的使用。

其实这工作早就该做,好久之前就有朋友问,但人就犯懒,再加上忙,就没有腾出时间来整理。O(∩_∩)O。

这里一并帮大家理解一下,有问题可以一起讨论。

PS:[整理]Libsvm官方FAQ翻译
http://www.matlabsky.com/forum-v … -fromuid-18677.html

言归正传:

使用libsvm工具箱时,可以指定使用工具箱自带的一些核函数(-t参数),主要有:

-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)

但有时我们需要使用自己的核函数,这时候可以用 -t 4参数来实现:
-t kernel_type : set type of kernel function (default 2)
4 – precomputed kernel (kernel values in training_instance_matrix)

使用-t 4参数时,再有了核函数后,需要给出核矩阵,关于核函数以及核函数构造相关的知识,大家可以看看相关书籍,在此不特别深入说明。

比如线性核函数 是 K(x,x’) = (x * x’),设训练集是train_data,设训练集有150个样本 , 测试集是test_data,设测试集有120个样本
则 训练集的核矩阵是 ktrain1 = train_data*train_data’
测试集的核矩阵是 ktest1 = test_data*train_data’
想要使用-t 4参数还需要把样本的序列号放在核矩阵前面,形成一个新的矩阵,然后使用svmtrain建立支持向量机,再使用svmpredict进行预测即可。形式与使用其他-t参数少有不同,如下:
ktrain1 = train_data*train_data’;

Ktrain1 = [(1:150)’,ktrain1];

model_precomputed1 = svmtrain(train_label, Ktrain1, ‘-t 4’); % 注意此处的 输入 Ktrain1

ktest1 = test_data*train_data’;

Ktest1 = [(1:120)’, ktest1];

[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label,Ktest1,model_precomputed1); % 注意此处输入Ktest1
复制代码
Remark:注意上面注释部分部分。

下面是一个整体的小例子,大家可以看一下:
%% Use_precomputed_kernelForLibsvm_example
% faruto
% last modified by 2011.04.20
%%
tic;
clear;
clc;
close all;
format compact;
%%
load heart_scale.mat;
% Split Data
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);

%% Linear Kernel
model_linear = svmtrain(train_label, train_data, ‘-t 0’);
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);

%% Precomputed Kernel One
% 使用的核函数 K(x,x’) = (x * x’)
% 核矩阵
ktrain1 = train_data*train_data’;
Ktrain1 = [(1:150)’,ktrain1];
model_precomputed1 = svmtrain(train_label, Ktrain1, ‘-t 4’);
ktest1 = test_data*train_data’;
Ktest1 = [(1:120)’, ktest1];
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label, Ktest1, model_precomputed1);

%% Precomputed Kernel Two
% 使用的核函数 K(x,x’) = ||x|| * ||x’||
% 核矩阵
ktrain2 = ones(150,150);
for i = 1:150
for j = 1:150
ktrain2(i,j) = sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
end
end
Ktrain2 = [(1:150)’,ktrain2];
model_precomputed2 = svmtrain(train_label, Ktrain2, ‘-t 4’);

ktest2 = ones(120,150);
for i = 1:120
for j = 1:150
ktest2(i,j) = sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
end
end
Ktest2 = [(1:120)’, ktest2];
[predict_label_P2, accuracy_P2, dec_values_P2] = svmpredict(test_label, Ktest2, model_precomputed2);
%% Precomputed Kernel Three
% 使用的核函数 K(x,x’) = (x * x’) / ||x|| * ||x’||
% 核矩阵
ktrain3 = ones(150,150);
for i = 1:150
for j = 1:150
ktrain3(i,j) = …
train_data(i,:)train_data(j,:)’/(sum(train_data(i,:).^2)^0.5 sum(train_data(j,:).^2)^0.5);
end
end
Ktrain3 = [(1:150)’,ktrain3];
model_precomputed3 = svmtrain(train_label, Ktrain3, ‘-t 4’);

ktest3 = ones(120,150);
for i = 1:120
for j = 1:150
ktest3(i,j) = …
test_data(i,:)train_data(j,:)’/(sum(test_data(i,:).^2)^0.5 sum(train_data(j,:).^2)^0.5);
end
end
Ktest3 = [(1:120)’, ktest3];
[predict_label_P3, accuracy_P3, dec_values_P3] = svmpredict(test_label, Ktest3, model_precomputed3);

%% Display the accuracy
accuracyL = accuracy_L(1) % Display the accuracy using linear kernel
accuracyP1 = accuracy_P1(1) % Display the accuracy using precomputed kernel One
accuracyP2 = accuracy_P2(1) % Display the accuracy using precomputed kernel Two
accuracyP3 = accuracy_P3(1) % Display the accuracy using precomputed kernel Three
%%
toc;
复制代码
运行结果:
Accuracy = 85% (102/120) (classification)
Accuracy = 85% (102/120) (classification)
Accuracy = 67.5% (81/120) (classification)
Accuracy = 84.1667% (101/120) (classification)
accuracyL =
85
accuracyP1 =
85
accuracyP2 =
67.5000
accuracyP3 =
84.1667
Elapsed time is 1.424549 seconds.
复制代码
关于核函数这里多说一下,核函数的正确选取依赖产生分类问题的实际问题的特点,因为不同的实际问题对相似程度有着不同的度量,核函数可以看作一个特征提取的过程,选择正确的核函数有助于提高分类准确率。
核函数的构造可以直接构造,也可以通过变换来得到

你可能感兴趣的:(libsvm-svm)