如何将.arff格式文件加载到Matlab中

6

有没有可以将.arff格式文件加载到Matlab中的软件包? .arff格式用于Weka运行机器学习算法。

6个回答

8

由于Weka是一个Java库,因此您可以直接使用其公开的API读取ARFF文件:

%## 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

4

有没有关于它如何使用的示例? - mike_x_
如果你将fileexchange文件解压到工作目录中,你可以使用以下方式来调用loadARFF方法: data = loadARFF('myfile.arf')。 - Matteo De Felice
我遇到了一个错误,但我会再次检查。我已经解压缩并通过单击“设置路径”按钮将带有子文件夹的文件夹添加到路径中。这样正确吗?我还需要做其他什么才能导入工具包吗? - mike_x_

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

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

处理大文件速度较慢,但在MATLAB 2010b中测试通过。


这很难相信,因为Matlab文档http://www.mathworks.com/help/matlab/import_export/supported-file-formats.html没有提到arff。除非Matlab的`importdata`转储所有标题/属性信息? - John

-1
如果上述方法不起作用,并且需要标头信息,请在Weka中加载arff文件,然后选择“另存为”选项,并使用csv文件格式保存数据。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接