分享

libsvm在matlab中的使用方法

 老狗肚皮 2014-05-29
前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。

接口下载在:http://www.csie./~cjlin/libsvm/index.html#matlab

具体使用方法zip文件里有readme说明,我也按照说明尝试的试用了一下,方法介绍如下。

使用的接口版本:
MATLAB A simple MATLAB interface LIBSVM authors at National Taiwan University. 2.89 http://www.csie./~cjlin/libsvm/matlab/libsvm-mat-2.89-3.zip

使用的运行环境为:
matlab 7.0, VC++ 6.0, XP系统。

按照说明使用方法如下:

1. 下载下来的借口包里有svm的一些源文件,没有可执行的exe文件,所以,必须先将svmtrain等源文件编译为matlab可以使用的dll等文件。于是先选择编译器,如下:

>> 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] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio
[2] Lcc C version 2.4 in D:\MATLAB7\sys\lcc
[3] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio

[0] None

Compiler: 3

Please verify your choices:

Compiler: Microsoft Visual C/C++ 6.0
Location: D:\Program Files\Microsoft Visual Studio

Are these correct?([y]/n): y

Try to update options file: C:\Documents and Settings\jink2005.AISEMINA-D6623E\Application Data\MathWorks\MATLAB\R14\mexopts.bat
From template:              D:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.bat

Done . . .

我选择使用VC 6.0,其他可能不行。编译器选择好后,使用make.m进行编译。

make.m的代码如下:

CODE:

% This make.m is used under Windows
mex -O -c svm.cpp
mex -O -c svm_model_matlab.c
mex -O svmtrain.c svm.obj svm_model_matlab.obj
mex -O svmpredict.c svm.obj svm_model_matlab.obj
mex -O libsvmread.c
mex -O libsvmwrite.c
可见,就是用来编译几个源文件为可使用的目标文件。调用如下:

>> make

结束后,当前目录中多了如下文件

libsvm在matlab中的使用方法
make-libsvm1.JPG



2. 接下来就可以按照用例使用matlab版的libsvm了,使用过程如下:

>> load heart_scale.mat
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');

产生的model结构如下:

libsvm在matlab中的使用方法
make-libsvm2.JPG



>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
>>

结束后,workspace中的内容如下:

libsvm在matlab中的使用方法
make-libsvm3.JPG



我的运行完全没有问题,如果你的有问题,请多多交流。注意下你是用的编译器,和matlab版本。
jink2005 (2009-8-17 14:56:15)
在matlab的libsvm使用的数据格式如下:
>> load heart_scale.mat
将训练数据载到到workspace中,其中,数据如下:

libsvm在matlab中的使用方法
libsvm_mat1.JPG


这里有两个数组:一个是n * 13维的数组,是训练数据的特征数据;另一个是n * 1维的列向量,对应前一数组,是特征对应的分类号。

其实,大家组织数据时,只要把特征向量,和类标志读到matlab的workspace中,就行了,就是普通的数组。

特征数据组织成这样:

libsvm在matlab中的使用方法
libsvm_mat2.JPG



对应的类别单独放在另一个变量:

libsvm在matlab中的使用方法
libsvm_mat3.JPG



这种格式的数据整理很简单,如在文本文件txt中,你就可以直接放一个和上图结构类似的数据,如下,然后用textread或dlmread读入workspace就行了。

iris_inst.txt
5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5.0 3.4 1.5 0.2
……

iris_label.txt
1
1
1
1
1
1
1
1
……

也可以整理到excel表格中,直接用xlsread读入。更简单的是在workspace标签旁的current file中直接双击这样的数据文件就导入到workspace中了。

使用时,根据你自己的训练样本的特征数组、类别数组,对例子中的参数做对应替换就行了。
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
自己使用时,heart_scale_label换成你自己的类别,heart_scale_inst换成自己的特征属性矩阵。

这个运行后就得到了训练后的model模型。

下面就要使用model进行预测了:
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);

预测使用的数据格式和训练样本的相同,heart_scale_label换为你测试样本的类别列向量,heart_scale_inst换成你测试样本的特征属性矩阵。运行结果,就在predict_label, accuracy, dec_values三个变量中。

我的理解是,类别预测时,预测的类别放在predict_label中;回归预测时,结果放在dec_values中。这是我的大致猜测,readme里肯定有说明。大家自己看看吧。
小小刘 (2009-8-17 15:33:45)
[i=s] 本帖最后由 小小刘 于 2009-8-17 16:06 编辑

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多