前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到看了下,原来,真的提供了matlab的使用接口。
接口下载在:u.edu.tw/~cjlin/libsvm/index.html#matlab
具体使用方法zip文件里有readme说明,我也按照说明尝试的试用了一下,方法介绍如下。
使用的接口版本: MATLAB
A simple MATLAB interface
LIBSVM authors at National Taiwan University.
2.89 u.edu.tw/~cjlin/libsvm/matlab/libsvm-mat-2.89-3.zip
使用的运行环境为:
matlab 7.0, VC++ 6.0, XP系统。
按照说明使用方法如下:
1. 下载下来的借口包里有svm的一些源文件,没有可执行的exe文件,所以,必须先将svmtrain等源文件编译为matlab可以使用的dll等文件。于是先选择编译器,如下:
(也可以先尝试使用我们在windows平台下编译好的文件,放在同一文件夹中直接使用:www.aiseminar/bbs/viewthread.php?tid=538&page=1&fromuid=3#pid1154)
>> 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的代码如下:
1.            % This make.m is used under Windows
2.            mex -O -c svm.cpp
3.            mex -O -c svm_model_matlab.c
4.            mex -O svmtrain.c svm.obj svm_model_matlab.obj
5.            mex -O svmpredict.c svm.obj svm_model_matlab.obj
6.            mex -O libsvmread.c
7.            mex -O libsvmwrite.c
可见,就是用来编译几个源文件为可使用的目标文件。调用如下:
>> make
结束后,当前目录中多了如下文件
下载
(52.32 KB)
2009-8-17 11:54
2. 接下来就可以按照用例使用matlab版的libsvm了,使用过程如下:
>> load heart_scale.mat
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
产生的model结构如下:
matlab 下载
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
>> 结束后,workspace中的内容如下:
下载
(30.78 KB)
2009-8-17 11:54
我的运行完全没有问题,如果你的有问题,请多多交流。注意下你是用的编译器,和matlab版本。
如果遇到:
>> make
??? Undefined function or variable 'make'.
请查看此链接解决问题:
www.aiseminar/bbs/viewthread.php?tid=709&page=1&fromuid=3#pid1481
>> make
??? Undefined function or variable 'make'.
这种使用方法是对的,然后就要看你下载的程序是否正确,是不是含有matlab接口的libsvm程序。如果确定没错,确认下和我图中内容是否一样存在make.m,对比红框位置,如果存在不会提示不到文件:
下载
(105.89 KB)
2009-11-24 23:08
matlab的libsvm使用的数据格式
在matlab的libsvm使用的数据格式如下:
>> load heart_scale.mat
将训练数据载到到workspace中,其中,数据如下:
下载 (23.36 KB)
2009-8-17 14:56
这里有两个数组:一个是n * 13维的数组,是训练数据的特征数据;另一个是n * 1维的列向量,对应前一数组,是特征对应的分类号。
其实,大家组织数据时,只要把特征向量,和类标志读到matlab的workspace中,就行了,就是普通的数组。
特征数据组织成这样:
下载 (64.88 KB)
2009-8-17 14:55
对应的类别单独放在另一个变量:
下载 (27.15 KB)
2009-8-17 14:55
这种格式的数据整理很简单,如在文本文件txt中,你就可以直接放一个和上图结构类似的数据,如下,然后用textread或dlmread读入workspace就行了。
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
……
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换成自己的特征属性矩阵。