为什么有人会使用arff
?请提供示例代码以阅读arff
文件并在java中使用它。
我在weka网站上找到了以下代码片段:
BufferedReader reader =
new BufferedReader(new FileReader("/some/where/file.arff"));
ArffReader arff = new ArffReader(reader);
Instances data = arff.getData();
data.setClassIndex(data.numAttributes() - 1);
之后是什么?有人能解释一下上面发生了什么吗?如何从文件中访问我的数据? weka网站提到了两种不同的用法,即批量和增量。这两者有什么区别?
答案 0 :(得分:1)
好吧,通常有人会使用arff
,因为它是一种非常简单的文件格式,基本上是一个csv
文件,带有描述数据的标题,这是常用的保存方式/使用Weka读取数据。
用于读取arff文件的示例代码正是您提供的示例代码,如果您想要使用已加载的实例,则应使用您的数据。要打印它们:System.out.println(data);
您可以查看很多关于如何处理数据的示例(分类,聚类等)here。
您正在使用的代码在标准的BufferedReader中加载arff文件,然后创建一个ArffReader实例(arff),它完全从读取器读取数据,然后使用getData方法返回{{3对象(称为数据)。最后,设置哪个属性是类(arff文件中的最后一个)。
如果要迭代Instances对象并检索每个实例:
for (int i = 0; i <= data.numInstances - 1; i++) {
Instance instance = data.getInstance(i);
System.out.println(instance.stringValue(0)); //get Attribute 0 as String
}
您正在讨论从arff文件中批量读取和增量读取。批处理模式完全读取arff文件,增量模式使您有机会读取arff文件的每个实例(行)并手动添加它。
增量模式代码:
BufferedReader reader =
new BufferedReader(new FileReader("/some/where/file.arff"));
ArffReader arff = new ArffReader(reader, 1000);
Instances data = arff.getStructure();
data.setClassIndex(data.numAttributes() - 1);
Instance inst;
while ((inst = arff.readInstance(data)) != null) {
data.add(inst);
}
答案 1 :(得分:1)
由于缺少示例和非常模糊的javadoc,我发现构建阅读器非常困难。所以这里是我编写的一小段代码,用于读取经过测试和工作的数值属性关系的关系!
BufferedReader reader = new BufferedReader(new FileReader(new File(path)));
ArffReader arff = new ArffReader(reader, 1000);
Instances data = arff.getStructure();
data.setClassIndex(0);
Instance inst;
while ((inst = arff.readInstance(data)) != null) {
// the first attribute is ignored because it is the index
for(int i = 1 ; i < inst.numAttributes() ; i++) {
switch(inst.attribute(index).type()) {
case Attribute.NUMERIC :
System.out.println(inst.value(index));
case Attribute.STRING :
System.out.println(inst.stringValue(index));
case Attribute.RELATIONAL :
// test if we have an imbrication of two relations or not
if (inst.attribute(index).relation().numAttributes() > 0 &&
inst.attribute(index).relation().attribute(0).isRelationValued()) {
inst.attribute(index).relation().attribute(0).isRelationValued()) {
// case of an array of int arrays
double[][] seq = new double[inst.attribute(index).relation().numAttributes()][];
for (int i = 0 ; i < inst.attribute(index).relation().numAttributes() ; i++) {
Instances instances = inst.relationalValue(index);
seq[i] = new double[instances.attribute(0).relation().numAttributes()];
Instance q = instances.instance(0).relationalValue(i).get(0);
for(int j = 0 ; j < instances.attribute(0).relation().numAttributes() ; j++) {
seq[i][j] = q.value(j);
}
}
System.out.println(seq);
} else {
// case wit only an arry of int
double[] seq = new double[inst.attribute(index).relation().numAttributes()];
for (int i = 0 ; i < inst.attribute(index).relation().numAttributes() ; i++) {
seq[i] = inst.value(i);
}
System.out.println(seq);
}
}
}
System.out.println("index is : "+((int) inst.value(0)));
}
以下是数据的样子,每个元素由一个索引和一对数字三元组组成:
@relation 'name of relation'
@attribute index numeric
@attribute attr1 relational
@attribute attr1.0 relational
@attribute attr1.0.0 numeric
@attribute attr1.0.1 numeric
@attribute attr1.0.2 numeric
@end attr1.0
@attribute attr1.1 relational
@attribute attr1.1.0 numeric
@attribute attr1.1.1 numeric
@attribute attr1.1.2 numeric
@end attr1.1
@end attr1
@data
0,'\'23,25,48\',\'12,0,21\''
115260,'\'34,44,72\',\'15,8,32\''
230520,'\'175,247,244\',\'107,185,239\''
345780,'\'396,269,218\',\'414,276,228\''
461040,'\'197,38,42\',\'227,40,43\''
希望它可以帮助某人