2011-08-05 267 views

回答

4

是的,MATLAB File Exchange上的WEKA文件有几个MATLAB接口,我通常使用这个:http://www.mathworks.com/matlabcentral/fileexchange/21204-matlab-weka-interface,其中有一个saveARFF()和一个loadARFF()函数。

+0

有关它如何使用的任何示例? –

+0

如果您将fileexchange文件解压缩到工作目录中,则可以通过以下方式使用loadARFF: data = loadARFF('myfile.arf')。 –

+0

我收到一个错误,但我会再次检查。我已经解压缩并通过点击“设置路径”按钮在子路径中添加了文件夹。这是对的吗?为了导入工具包,我还必须做其他事情吗? –

8

由于Weka is a Java library,你可以直接使用它暴露给读取ARFF文件API:

%## paths 
WEKA_HOME = 'C:\Program Files\Weka-3-7'; 
javaaddpath([WEKA_HOME '\weka.jar']); 
fName = [WEKA_HOME '\data\iris.arff']; 

%## read file 
loader = weka.core.converters.ArffLoader(); 
loader.setFile(java.io.File(fName)); 
D = loader.getDataSet(); 
D.setClassIndex(D.numAttributes()-1); 

%## dataset 
relationName = char(D.relationName); 
numAttr = D.numAttributes; 
numInst = D.numInstances; 

%## attributes 
%# attribute names 
attributeNames = arrayfun(@(k) char(D.attribute(k).name), 0:numAttr-1, 'Uni',false); 

%# attribute types 
types = {'numeric' 'nominal' 'string' 'date' 'relational'}; 
attributeTypes = arrayfun(@(k) D.attribute(k-1).type, 1:numAttr); 
attributeTypes = types(attributeTypes+1); 

%# nominal attribute values 
nominalValues = cell(numAttr,1); 
for i=1:numAttr 
    if strcmpi(attributeTypes{i},'nominal') 
     nominalValues{i} = arrayfun(@(k) char(D.attribute(i-1).value(k-1)), 1:D.attribute(i-1).numValues, 'Uni',false); 
    end 
end 

%## instances 
data = zeros(numInst,numAttr); 
for i=1:numAttr 
    data(:,i) = D.attributeToDoubleArray(i-1); 
end 

%## visualize data 
parallelcoords(data(:,1:end-1), ... 
    'Group',nominalValues{end}(data(:,end)+1), ... 
    'Labels',attributeNames(1:end-1)) 
title(relationName) 

parallel_coordinates

你甚至可以直接从MATLAB使用其功能。举个例子:

%## classification 
classifier = weka.classifiers.trees.J48(); 
classifier.buildClassifier(D); 
fprintf('Classifier: %s %s\n%s', ... 
    char(classifier.getClass().getName()), ... 
    char(weka.core.Utils.joinOptions(classifier.getOptions())), ... 
    char(classifier.toString())) 

输出C4.5决策树:

Classifier: weka.classifiers.trees.J48 -C 0.25 -M 2 
J48 pruned tree 
------------------ 

petalwidth <= 0.6: Iris-setosa (50.0) 
petalwidth > 0.6 
| petalwidth <= 1.7 
| | petallength <= 4.9: Iris-versicolor (48.0/1.0) 
| | petallength > 4.9 
| | | petalwidth <= 1.5: Iris-virginica (3.0) 
| | | petalwidth > 1.5: Iris-versicolor (3.0/1.0) 
| petalwidth > 1.7: Iris-virginica (46.0/1.0) 

Number of Leaves :  5 

Size of the tree : 9 
2

如果你只想要加载存储在“ARFF”格式到Matlab文件,并且不需要任何其他功能从Weka中删除“arff”文件的头部分(这些属性定义),并将文件保存为csv格式(应该用数字等价替换类值),然后使用内置的“csvread”函数的Matlab。这样就不需要找到第三方包。

2
M = importdata('filename.arff'); 

对于大文件非常慢,但它的工作原理

+0

这很难相信,因为matlab文档http://www.mathworks.com/help/matlab/import_export/supported-file-formats.html没有调用arff。除非matlab的'importdata'转储所有的头文件/属性信息? – John

0

如果上述方法都不奏效,并且报头信息是必需的,加载WEKA的ARFF文件(在MATLAB 2010年b测试),然后选择另存为选项并使用csv文件格式保存数据。

0

只需在arff开始处删除所有带有“@”的行,然后将其保存为.txt格式,之后您只需将其拖入工作区或甚至导入它即可。 它每次都适用于我 干杯