2015-04-01 4 views
2

Зачем кому-то пользоваться arff? И, пожалуйста, дайте образец кода для чтения файла arff и используйте его в java.Концепция arff и как читать weka 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 упоминает два разных варианта использования, а именно: пакетный и инкрементный. В чем разница между ними?

ответ

1

Ну, обычно кто-то будет использовать arff, потому что это очень простой формат файла, в основном файл csv с заголовком, описывающим данные, и это обычный способ сохранения/чтения данных с помощью Weka.

Образец кода для чтения файла arff - это именно тот, который вы предоставили, если вы хотите использовать загруженные экземпляры, вы должны работать с вашими данными. Чтобы напечатать их: System.out.println(data); Вы можете проверить множество примеров того, как работать с данными (классификация, кластеризация и т. Д.) here.

Код, который вы используете, загружает файл arff в стандартный BufferedReader, а затем создает экземпляр ArffReader (arff), который полностью считывает данные из читателя, после чего вы используете метод getData для возврата данных в объект Instances (называемые данными). Наконец, вы устанавливаете, какой атрибут является классом (последний в вашем файле arff).

Если вы хотите перебрать объект Экземпляры и получить каждый экземпляр:

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

Я нашел его очень трудно построил читатель из-за отсутствием примеров и очень неоднозначной 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\'' 

Надеется, что это может помочь кому-то

+0

ли тестированию кода? –

+0

Да, но это только в моем конкретном случае, это не общий подход. Именно здесь приводится пример того, как читать объект arff. Это может не справиться с некоторыми конкретными случаями. – BaptisteL

Смежные вопросы