下载了FormatDataLibsvm试着用了用,然鹅没成功,而且觉得数据量大的时候用它有点麻烦,还是直接代码转换吧。在吸收了各路大神的经验后终于成功了,在此记录一下小白成长的一小步。
libSVM的数据格式
Label index1:value1 index2:value2 index3:value3 ….
Label index1:value1 index2:value2 index3:value3 ….
Label:是类别的标识,可以自己随意定,比如1,-1,再比如-10,0,15。当然,如果是回归,这是目标值,就要实事求是了。
index :是有顺序的索引,通常是连续的整数。就是指特征编号,必须按照升序排列。
Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开。比如:
-15 1:0.708 2:1056 3:-0.3333
需要注意的是,如果特征值为0,index可以不连续。如:
-15 1:0.708 3:-0.3333
表明第2个特征值为0,从编程的角度来说,这样做可以减少内存的使用,并提高做矩阵内积时的运算速度。我们平时在matlab中产生的数据都是没有序号的常规矩阵,所以为了方便最好编一个程序进行转化。
将矩阵转换为libSVM的数据格式
转换后保存为txt文件便于读取。
function libsvmtransform(A,filename)
[m,n]=size(A);
txt='.txt';
file=[filename,txt];
fid = fopen(file,'w');%写入文件路径
for i=1:m
temp1 = A(i,2:n);%存储A中每一行从第2位开始的值
temp2 = [];
for j = 1:length(temp1)
if temp1(j) ~= 0
temp2 = [temp2 ' ' num2str(j) ':' num2str(temp1(j))];
else
temp2 = [temp2];
end
end % temp2存放A一行添加序号的结果
temp3 = [num2str(A(i,1)) temp2];%temp3存放最终一行的结果
[m1,n1] = size(temp3);
for k = 1:n1
if k == n1
fprintf(fid,'%c\n',temp3(k));
else
fprintf(fid,'%c',temp3(k));
end
end
end
fclose(fid);
测试
假设有如下矩阵A,矩阵第一列数字为自定义的类别标识0和1:
A =
1 1 0 1 2 4
1 5 1 3 4 6
0 4 6 5 0 8
0 2 1 0 4 6
命令行:
>> libsvmtransform(A,'aa')
>> open('aa.txt')
aa.txt:

读取:
>> [labels,features]=libsvmread('aa.txt')
LibSVM数据格式转换实战
本文详细介绍了如何将矩阵数据转换为适用于LibSVM的特定格式,包括数据格式的规范说明、转换代码实现及测试过程,为机器学习爱好者提供了一个实用的指南。

5429

被折叠的 条评论
为什么被折叠?



