在MATLAB平台下用libsvm分类

来源:互联网 发布:装饰工程预算软件 编辑:程序博客网 时间:2024/06/17 13:24

      前段时间一直在弄LIBSVM的C++版,今天想在MATLAB平台上做个测试(这里做的svm与matlab里面自带的svm工具箱不一样)。

      所用工具版本:林智仁老师目前的最新版本libsvm-3.17  http://www.csie.ntu.edu.tw/~cjlin/libsvm/

                              MATLAB 2010b

                              Visual Studio 2010

1安装libsvm-mat

1.1添加libsvm-mat工具箱

File - set path -  Add with subfolders - libsvm-mat工具箱所在文件夹

subfolders是可以加入当前文件夹以及里面的子文件夹,而folder不行。

1.2选择编译器

libsvm最初版本是C++编写,在MATLAB平台使用需要用编译器编译,生成.mexw32文件。键入mex -setup命令选择使用哪种编译器,注意”mex“与”-“之间有空格

mex -setup

出现是否选择已经安装的编译器,键入y得到一系列本机已经安装的编译器,我选择2(VS2010),之后就是确认编译器路径是否正确,最后看到Done就OK啦,忽略Warning的。

\

啊,这里之前我的MATLAB是2009a,不能用VS2010编译。看到网上有人说在是否选择已安装的编译器这里键入n,然后可以看到适合2009的编译器再来选择。结果我好像木有,就悲催的升级MATLAB啦。

下面就可以编译了

make

这时就可以看到.c文件生成了相应的.mexw32文件。

2加载数据

如果数据格式是matlab对应的那种:heart_scale.mat { data.mat (double) & label.mat(double) }

就是说数据和标签分开存储的,而且标签是double类型,那就可以直接(但是libsvm-3.17 里面木有这种数据

load heart_scale

如果是C++版的格式:heart_scale.txt {1:34  2:22... }

这就需要用matlab自带函数转换了

[label_vector,instance_matrix] = libsvmread('heart_scale');  

完成该步骤之后在Workspace发现heart_scale_inst和heart_scale_label就说明成功转换了。

我所用的数据格式与matlab版的很相似,但是 label.mat是string类型,这纠结了我一个上午,还是matlab太不熟了。

解决方法:

a) 先编写一个简单的替换函数,用数字替换字符串标签

但由于我的字符串数据中包含有单引号,解决方法
>> str = '''string'''
str =
'string'
PS: 如果你想要双引号,比如 str = "string"
此时就直接输入双引号就行了.
如下:
>> str = ' "string" '
str =
"string"

b )cell2mat()

function [ans] = label_double( label_str )%   convert the label from string to double for i=1:size(label_str,1)    if strcmp(label_str(i),'''Climb''')        label_str(i) = {0.0};    elseif strcmp(label_str(i),'''Walk''')       label_str(i) = {1.0};    elseif strcmp(label_str(i),'''Stop''')        label_str(i) = {2.0};    elseif strcmp(label_str(i),'''Run''')       label_str(i) = {3.0};    elseif strcmp(label_str(i),'''Sit''')        label_str(i) = {4.0};    elseif  strcmp(label_str(i),'''Stand''')       label_str(i) = {5.0};    endendans = cell2mat(label_str);end

3一个例子

终于解决了数据格式,现在可以做一个分类啦,用的是另输入测试样本

label_trainD = label_double(label_train)label_testD = label_double(label_test)model = svmtrain(label_dataD,data_train,'-s 0 -t 0')[predicted_label] = svmpredict(label_testD,data_test,model)

 结果

Accuracy = 97.5926% (527/540) (classification)

恩,精度很高,速度也不错!


参考资料:

http://blog.csdn.net/abcjennifer/article/details/7370177

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

林智仁老师MATLAB工具箱里面的README


以后坚持写blog!O(∩_∩)O哈哈~

原创粉丝点击