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:实例矩阵(是一个稀疏矩阵)
原始数据如下:
使用libsvm数据格式为:标签 属性(x1)编号1:数据 属性(x2)编号2:数据 属性(x3)编号3:数据 ... 属性(xn)编号n:数据
上面的数据可以表示为如下:
(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如下所示。
图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)
原问题:
对偶问题:
在对偶问题解决后,w为:
当一个新的样本x进来是,决策函数为:
2.v-Support Vector Classification(v-svn)(Scholkopfet et al, 2000)
v属于(0,1]
原问题:
对偶问题:
五、小结
SVM 怎样能得到好的结果
1. 对数据做归一化(simple scaling)
2. 应用 RBF kernel
3. 用cross-validation和grid-search得到最优的c和g
4. 用得到的最优c和g训练训练数据
5. 测试
参考:libsvm参数说明
参考:libsvm--svmtrain\svmpredict函数说明
参考:百度文库