Matlab下libsvm的配置使用【转】
http://blog.csdn.net/u010869312/article/details/45504797
LIBSVM是一个由台湾大学林智仁(Lin Chih-Jen)教授等开发的SVM模式识别与回归的软件包,使用简单,功能强大,能够在matlab中使用。
一、 安装
1.下载
在LIBSVM的主页上下载最新版本的软件包(libsvm-3.20),并解压到合适目录中。
2.编译
如果你使用的是64位的操作的系统和Matlab,那么不需要进行编译步骤,因为自带软件包中已经包含有64位编译好的版本:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64。否则,需要自己编译二进制文件。
首先在matlab中进入LIBSVM根目录下的matlab目录(如C:\libsvm-3.20\matlab),在命令窗口输入
>>mex -setup
然后Matlab会提示你选择编译mex文件的C/C++编译器,就选择一个已安装的编译器。之后Matlab会提示确认选择的编译器,输入y进行确认。
然后可以输入以下命令进行编译。
>>make
注意,Matlab或VC版本过低可能会导致编译失败,建议使用最新的版本。
编译成功后,当前目录下会出现若干个后缀为mexw64(64位系统)或mexw32(32位系统)的文件。
3.重命名(可选,但建议执行)
编译完成后,在当前目录下回出现svmtrain.mexw64、svmpredict.mexw64(64位系统)或者svmtrain.mexw32、svmpredict.mexw32(32位系统)这两个文件,把文件名svmtrain和svmpredict相应改成libsvmtrain和libsvmpredict。
这是因为Matlab中自带有SVM的工具箱,而且其函数名字就是svmtrain和svmpredict,和LIBSVM默认的名字一样,在实际使用的时候有时会产生一定的问题,比如想调用LIBSVM的变成了调用Matlab SVM。
如果有进行重命名的,以后使用LIBSVM时一律使用libsvmtrain和libsvmpredict这两个名字进行调用。
4.添加路径
为了以后使用的方便,建议把LIBSVM的编译好的文件所在路径(如C:\libsvm-3.20\matlab)添加到Matlab的搜索路径中。具体操作为:(中文版Matlab对应进行)
HOME -> Set Path -> Add Folder -> 加入编译好的文件所在的路径(如C:\libsvm-3.20\matlab)
当然也可以把那4个编译好的文件复制到想要的地方,然后再把该路径添加到Matlab的搜索路径中。
二 、测试
LIBSVM软件包中自带有测试数据,为软件包根目录下的heart_scale文件,可以用来测试LIBSVM是否安装成功。这里的heart_scale文件不能用Matlab的load进行读取,需要使用libsvmread读取。
进入LIBSVM的根目录运行以下代码(因为heart_scale文件没有被添加进搜索路径中,其他路径下无法访问这个文件):
[heart_scale_label,heart_scale_inst]=libsvmread(\'heart_scale\'); model=libsvmtrain(heart_scale_label,heart_scale_inst,\'-c 1 -g 0.07\'); [predict_label,accuracy,dec_values]=libsvmpredict(heart_scale_label,heart_scale_inst,model);
如果LIBSVM安装正确的话,会出现以下的运行结果,显示正确率为86.6667%。
optimication finished,#iter=134 nu=0.433785 obj=-101.855060,rho=0.426412 nSV=130,nBSV=107 Total nSV=130 Accuracy=86.6667%(234/270)(classification)
三、使用
关于LIBSVM在Matlab中的使用,可以参看软件包中matlab目录下的README文件,这里对里面内容做一个翻译和一些细节的讲解。
1.训练
libsvmtrain函数用于对训练集的数据进行训练,得到训练好的模型。
model=libsvmtrain(training_label_vector,training_instance_matrix[,\'libsvm_options\']);
libsvmtrian函数有三个输入参数,其中:
training_label_vector:为训练样本的类标。如果有m个样本,此参数应为mx1的矩阵(类型必须为double)。可以是二分类,也可以是多分类,类标可以是(-1,1),也可以是(1,2,3)或其他,但必须是double类型。
training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为mxn矩阵(类型为double)。
libsvm_options(可选):训练时SVM分类器参数,在第3点详细介绍。
2.预测
libpredict函数用于对测试集的数据进行测试,还能对未知样本进行预测。
[predicted_label, accuracy, decision_values/prob_estimates] = libsvmpredict(testing_label_vector, testing_instance_matrix, model [, \'libsvm_options\']);
这个函数包括四个参数,其中:
testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
model:使用libsvmtrain返回的模型
libsvm_options(可选):预测的参数,与训练的参数形式一样。
3.训练的参数
LIBSVM训练时可以选择的参数很多,包括:
-s svm类型:SVM设置类型(默认0)
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数:u’v
1 – 多项式核函数:(ru’v + coef0)^degree
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
3 – sigmoid核函数:tanh(ru’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,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
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
4.训练返回的内容
libsvmtrain函数返回训练好的SVM分类器模型,可以用来对未知的样本进行预测。这个模型是一个结构体,包含以下成员:
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
-s SVM类型(默认0);
-t 核函数类型(默认2)
-d 核函数中的degree设置(针对多项式核函数)(默认3);
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2
-totalSV: 表示支持向量的总数
-rho: 决策函数wx+b中的常数项的相反数(-b)
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1
-ProbA: 使用-b参数时用于概率估计的数值,否则为空
-ProbB: 使用-b参数时用于概率估计的数值,否则为空
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个
-sv_coef: 表示每个支持向量在决策函数中的系数
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
5.预测返回的内容
-predicted_label:表示样本的预测类序号
-accuracy:一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数
decision_values/prob_estimates:一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
6.读取和保存
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
[label_vector, instance_matrix] = libsvmread(‘data.txt’);
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
libsvmwrite(‘data.txt’, label_vector, instance_matrix];
这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。