
SVM
以前都是在windows下面用32位的机器做些试验等等,最近实验室采购了新机器,4G的内存,正好Ubuntu10.04刚刚放出,也就装了一个64位的系统,可以充分的利用内存做些试验。
最近在做图像分类的一些东西,肯定svm是得用的,我用的是比较简单的libsvm,在matlab中用的,将libsvm的path,通过addpath加入到matlab的工作环境当中,我下载的是matlab接口的那个A simple MATLAB interface。在windows32位系统下面试验是没有问题的。但是放到linux下面去就出问题了,不能用。开始不知道为什么,因为还没习惯自己是在64位的系统下面,当自己顿悟之后,发现了libsvm目录下的几个.mexw32,呵呵,32位的肯定不能用了。
只要重新再编译一下就行了,首先修改libsvm下面的Makefile文件,其实不想多改的话只要将matlab的目录改改就行了,例如我的是:
MATLABDIR ?= /usr/local/matlabR2010a
当然,我的matlab也是64位的,具体怎么安装可以参考我以前的一篇博文,详细的安装步骤。
然后 make ,编译成功就行了,目录下有了.mexw64。这样之后,libsvm就可以用了,当然修改代码之后还要重新make下吧。
如果你是svm的初学者,这里有个很好的教程:A practical guide to SVM classification,很具体很傻瓜,你可以看看。
==============================================
接下来就可以按照用例使用matlab版的libsvm了,使用过程如下:
>> load heart_scale.mat
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
产生的model结构如下:
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
>>
结束后,workspace中的内容如下:
我的运行完全没有问题,如果你的有问题,请多多交流。注意下你是用的编译器,和matlab版本。
>> load heart_scale.mat
将训练数据载到到workspace中,其中,数据如下:

libsvm_mat1.JPG
这里有两个数组:一个是n * 13维的数组,是训练数据的特征数据;另一个是n * 1维的列向量,对应前一数组,是特征对应的分类号。
其实,大家组织数据时,只要把特征向量,和类标志读到matlab的workspace中,就行了,就是普通的数组。
特征数据组织成这样:

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

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里 肯定有说明。大家自己看看吧。link








不会用linux
@王玉明
嗯 其实也不难 没有学不会的东西
说实话 没怎么用过
果然内涵。。。
技术帖啊,收藏者,以后在linux下用MATLAB用得着。
学习中!
o(∩_∩)o
学习了!
技术类文章老九还是支持一下吧
@林西老九
哈哈 谢谢谢谢
你好,我的实验室也是购买了64位的机子,我们用的win7的系统,可是我在使用MATLAB2009的过程中发现,在MEX之后找不到LCC编译器,不知道怎么回事,不知您遇到过没有,请教您一下,谢谢!
@林西老九
没遇到过 应该会提示你用matlab自己的编译器还是你安装的VC或者VS的