Matlab环境下使用Libsvm

原创 2015年11月18日 11:28:17

1. 参考网站

libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html 

详解:http://www.matlabsky.com/thread-11925-1-1.html

在LIBSVM的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载最新版本的软件包,并解压到合适目录中。

2. 编译

如果你使用的是64位的操作的系统和Matlab,那么不需要进行编译步骤,因为自带软件包中已经包含有64位编译好的版本:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64。否则,需要自己编译二进制文件。

首先在Mtlab中进入LIBSVM根目录下的matlab目录(如C:\libsvm-3.17\matlab),在命令窗口输入

>>mex –setup

然后Matlab会提示你选择编译mex文件的C/C++编译器,就选择一个已安装的编译器,如Microsoft Visual C++ 2010。之后Matlab会提示确认选择的编译器,输入y进行确认。

如:在matlab命令窗口中输入
mex -setup
显示

Please choose your compiler for building external interface (MEX) files: 
 
Would you like mex to locate installed compilers [y]/n?

输入y
Select a compiler: 
[1] Lcc-win32 C 2.4.1 in D:\MATLAB\R2010a\sys\lcc 
[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0 
[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio 
 
[0] None 

Compiler:

需要你选择编译器
我输入的是3 即选择VC++ 6.0
Please verify your choices: 
 
Compiler: Microsoft Visual C++ 6.0 
Location: D:\Program Files\Microsoft Visual Studio 
 
Are these correct [y]/n?
再次确认自己的选择,输入y

Trying to update options file: C:\Users\DELL\AppData\Roaming\MathWorks\MATLAB\R2010a\mexopts.bat 
From template:              D:\MATLAB\R2010a\bin\win32\mexopts\msvc60opts.bat 
 
Done . . . 


编译器选择好了之后,用make.m编译



3. 测试

1读取测试数据:

有两个数据集,一个是C++的, 一个是matlab的。libsvm库中下载的是C++数据,所以matlab加载我们下载的heart_scale是会报错的:


这时怎么办?

法1、下载matlab数据集(http://download.csdn.net/detail/abcjennifer/4215779

法2、用libsvmread而非load,就是这里

[heart_scale_label,heart_scale_inst] = libsvmread('heart_scale');



2训练
libsvm函数用于对训练集的数据进行训练,得到训练好的模型。
 model=svmtrain(heart_scale_label,heart_scale_inst);

这个函数有三个参数,其中

  • -training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
  • -training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  • -libsvm_options:训练的参数,在第3点详细介绍。

3预测
libpredict函数用于对测试集的数据进行测试,还能对未知样本进行预测。
[predicted_label, accuracy, decision_values] = svmpredict(heart_scale_label,heart_scale_inst,model);

这个函数包括四个参数,其中

  • -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:预测的参数,与训练的参数形式一样。

4训练参数

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 – 多项式核函数:(r*u’v + coef0)^degree
        2 – RBF(径向基)核函数:exp(-r|u-v|^2)
        3 – sigmoid核函数:tanh(r*u’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类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。


5训练返回的内容

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参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。


6预测返回的内容

libsvmtrain函数有三个返回值,不需要的值在Matlab可以用~进行代替。

  • -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的预测结果。


7保存数据

libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

4. 训练参数c和g的优化

网格参数寻优函数(分类问题):SVMcgForClass
[bestCVaccuracy,bestc,bestg]= 
SVMcgForClass(train_label,train,
cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
输入:
train_label:训练集的标签,格式要求与svmtrain相同。
train:训练集,格式要求与svmtrain相同。
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
输出:
bestCVaccuracy:最终CV意义下的最佳分类准确率。
bestc:最佳的参数c。
bestg:最佳的参数g。


网格参数寻优函数(回归问题):SVMcgForRegress
[bestCVmse,bestc,bestg]= 
SVMcgForRegress(train_label,train,
cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
其输入输出与SVMcgForClass类似,这里不再赘述。


而当你训练完了model,在用它做classification或regression之前,应该知道model中的内容,以及其含义。

用来训练的是libsvm自带的heart数据

model = 
    Parameters: [5x1 double]
      nr_class: 2
       totalSV: 259                   % 支持向量的数目
           rho: 0.0514               %  b
         Label: [2x1 double]     %  classification中标签的个数
         ProbA: []
         ProbB: []
           nSV: [2x1 double]     %  每类支持向量的个数
        sv_coef: [259x1 double]  %   支持向量对应的Wi

           SVs: [259x13 double]  %   装的是259个支持向量

model.Parameters参数意义从上到下依次为:
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)


SVM 怎样能得到好的结果

1.    对数据做归一化(simple scaling

2.    应用 RBF kernel

3.    cross-validationgrid-search得到最优的cg

4.    用得到的最优cg训练训练数据

5.    测试


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Libsvm在matlab环境下使用指南

一、安装 http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/。在这个地址上可以下的包含matlab接口的源程序。下载完后可以放到放到任意的盘上解压,最好...

Windows 64 位 Matlab R2013a 环境下安装 libsvm

Windows 64 位 Matlab R2013a 环境下安装 libsvm 在这种环境下, 安装 libsvm 可以说是傻瓜似的了, 但就我搜出的 libsvm 安装...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

SVM实现及Libsvm工具箱的安装测试(基于Matlab R204a环境)

SVM matlab自带函数实现以及libsvm工具箱的使用

matlab下libsvm的配置使用

LIBSVM是一个由台湾大学林智仁(Lin Chih-Jen)教授等开发的SVM模式识别与回归的软件包,使用简单,功能强大,能够在matlab中使用。 一、 安装 1.下载 在LIBSVM的主页...

libsvm在MATLAB中的简单使用

libsvm简介 LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统...

解密SVM系列(五):matlab下libsvm的简单使用:分类与回归

本节简单介绍一下libsvm的使用方法。关于libsvm似乎曾经使用过,那个时候主要用libsvm进行简单的人脸识别实验。当时还翻译过关于libsvm里面的matlab英文文档介绍与分类实验那么现在最...
  • on2way
  • on2way
  • 2015-08-17 22:33
  • 13760

LibSVM 在matlab中的使用

搞了一天,看了很多资料,终于搞好了matlab中调用大牛写好的svm库,将结果告诉大家避免以后走弯路。 1. 参考网站: libsvm库下载:http://www.csie.ntu.edu...

LIBSVM在Matlab下的使用

支持向量机(SVM,Support Vector Machine)是一种基于统计学习理论的模式识别方法,在解决小样本、高维度及非线性的分类问题中应用非常广泛。 LIBSVM是一个由台湾大学林智仁(L...

libsvm(MATLAB版本)安装与使用

一.下载libsvm 1.libsvm - 3.22 : https://github.com/cjlin1/libsvm  配套使用MATLAB2013以上,VisualStudio2015以上 ...

Matlab安装使用libsvm

防止别人重复犯一些错误,把网络上看到得东西总结一下,希望对某些人有些帮助。 20120703   一.下载libsvm http://www.csie.ntu.edu.tw/~...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)