您的位置:首页 > 其它

LIBSVM数据格式及其使用

2015-08-11 17:14 453 查看
关于支持向量机(SVM)的理论部分推荐一个博客:支持向量机通俗导论(理解SVM的三层境界)

/article/1350687.html

July的博客分三层讲述支持向量机,对于我们需要了解道不同层次的学习者来说,一目了然。

我也是通过此博客进行学习的。

假若你已经基本上掌握了SVM的理论部分,那么如何对数据进行分析呢?

我们一般对数据使用SVM进行分类的时候,使用的是林智仁的SVM库:LIBSVM

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

在这里可以下载到最新的库,而且能够下载到训练所用的数据,但是数据连接点开之后只能复制,就像这个数据集:

http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/breast-cancer

不能下载,那我们复制完之后存储成什么格式呢?

我们可以从LIBSVM里面随便下载一个数据,比如libsvm里面自带的heart_scale,然后用notepad打开,粘贴保存即可

对于自己的数据怎么办呢?

首先,我们知道LIBSVM里面的数据格式如下:

Label 1:value 2:value ….

其次,我们使用FormatDataLibsvm.xls生成这种格式,具体如下:

下载FormatDataLibsvm.xls(百度搜索)

运行FormatDataLibsvm.xls(注意这时会有一个关于“宏已禁宏”的安全警示,点击“选项”,选择“启用此内容”,确定即可);1,先运行FormatDataLibsvm.xls然后将数据粘贴到sheet1的topleft单元。

2、 打开data.xls,(注:网上很多的介绍都是直接将数据粘贴到sheet1的topleft单元),要特别注意的是这时候的数据排列顺序应该是:

条件属性a   条件属性b  ...  决策属性

7     5    ...  2

4     2    ...  1

3、"工具"-->"宏"-->执行下面有一个选项(FormatDatatoLibsvm)-->执行,要选中这个然后点击“运行” ,这时候数据讲变成:

决策属性  条件属性a  条件属性b  ...

2    1:7    2:5    ...

1    1:4    2:2    ...


等数据转换完成后,将该文件保存为.txt文件。这时数据转换的问题就解决了。

最后,从LIBSVM里面随便下载一个数据,比如libsvm里面自带的heart_scale,然后用notepad打开,数据粘贴进保存即可

使用libsvm 3.18 MATLAB 编程对UCI的数据breast进行分类:

数据连接:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/breast-cancer

程序如下:

%数据本身分组加预测

[breast_label, breast_inst] =libsvmread('../breast_scale');

data= [breast_inst(:,1), breast_inst(:,2),breast_inst(:,3), breast_inst(:,4)];

%data = breast_inst;

groups = ismember(breast_label,2);                                         %将标签转换成1和0

[train, test] =crossvalind('holdOut',groups,0.7);                         %利用交叉耦合函数进行分组,70%的数据用来训练,剩下的数据进行预测

train_breast = data(train,:);                                       %获取train标签对应的训练数据

train_breast_labels = groups(train,:);

train_breast_labels = double(train_breast_labels );

test_breast = data(test,:);                                         %获取train标签对应的训练数据

test_breast_labels = groups(test,:);

test_breast_labels =double(test_breast_labels);

% 数据归一化

train_breast = normalization(train_breast',2);

test_breast = normalization(test_breast',2);

train_breast = train_breast';

test_breast = test_breast';

%训练和预测

model = svmtrain(train_breast_labels,train_breast, '-s 0 -t 0 -c 1 -g 0.07');

[predict_label, accuracy, dec_values] =svmpredict(test_breast_labels, test_breast, model);

[mm,mn] = size(model.SVs);

figure;

hold on;

[m,n] = size(train_breast);

for run = 1:m

if train_breast_labels(run) == 0

h1 = plot( train_breast(run,1),train_breast(run,2),'r+' );

else

h2 = plot( train_breast(run,1),train_breast(run,2),'g*' );

end

for i = 1:mm

if model.SVs(i,1)==train_breast(run,1) &&model.SVs(i,2)==train_breast(run,2)

h3 = plot( train_breast(run,1),train_breast(run,2),'o' );

end

end

end

legend([h1,h2,h3],'1','0','SupportVectors');

hold off;


运行结果:



optimization finished, #iter = 67190

nu = 0.093757

obj = -18.486007, rho = -0.113756

nSV = 22, nBSV = 16

Total nSV = 22

Accuracy = 95.1782% (454/477)(classification)

总之,数据前期处理很重要,归一化很重要,明白参数,逐一试试,才能达到较好的分类效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: