2014-02-12 4 views
3

Я использую этот пример для создания моего .arff-файла для моего weka projext enter link description here.Использование файла arff для хранения данных

double[][] data = {{4058.0, 4059.0, 4060.0, 214.0, 1710.0, 2452.0, 2473.0, 2474.0, 2475.0, 2476.0, 2477.0, 2478.0, 2688.0, 2905.0, 2906.0, 2907.0, 2908.0, 2909.0, 2950.0, 2969.0, 2970.0, 3202.0, 3342.0, 3900.0, 4007.0, 4052.0, 4058.0, 4059.0, 4060.0}, 
         {19.0, 20.0, 21.0, 31.0, 103.0, 136.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 212.0, 243.0, 244.0, 245.0, 246.0, 247.0, 261.0, 270.0, 271.0, 294.0, 302.0, 340.0, 343.0, 354.0, 356.0, 357.0, 358.0}}; 

    int numInstances = data[0].length; 

    FastVector atts = new FastVector(); 
    ArrayList<Instance> instances = new ArrayList<Instance>(); 
    for (int dim = 0; dim < 2; dim++) { 
     // Create new attribute/dimension 
     Attribute current = new Attribute("Attribute" + dim, dim); 
     // Create an instance for each data object 


     if (dim == 0) { 
      for (int obj = 0; obj < numInstances; obj++) { 
       instances.add(new SparseInstance(0)); 

      } 
     } 

     // Fill the value of dimension "dim" into each object 
     for (int obj = 0; obj < numInstances; obj++) { 
      instances.get(obj).setValue(current, data[dim][obj]); 
      System.out.println(instances.get(obj)); 
     } 

     // Add attribute to total attributes 
     atts.addElement(current); 

    } 

    // Create new dataset 
    Instances newDataset = new Instances("Dataset", atts, instances.size()); 

    // Fill in data objects 
    for (Instance inst : instances) { 
     newDataset.add(inst);  
    } 

    BufferedWriter writer = new BufferedWriter(new FileWriter("test.arff")); 
    writer.write(newDataset.toString()); 
    writer.flush(); 
    writer.close(); 
} 

Я ве заметил, что формат результата помещает строк элемент вектора в столбцах файла .arff. Я хочу поместить всю строку в первую строку файла .arff. Как я могу это сделать? В моем случае последний столбец вектора 2d представляет собой метку данных строки.

Ожидаемый результат для моего файла ARFF:

4058.0, 4059.0, 4060.0, 214.0, 1710.0, 2452.0, 2473.0, 2474.0, 2475.0, 2476.0, 2477.0, 2478.0, 2688.0, 2905.0, 2906.0, 2907.0, 2908.0, 2909.0, 2950.0, 2969.0, 2970.0, 3202.0, 3342.0, 3900.0, 4007.0, 4052.0, 4058.0, 4059.0, 4060.0, 1 // for example the first row 
19.0, 20.0, 21.0, 31.0, 103.0, 136.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 212.0, 
243.0, 244.0, 245.0, 246.0, 247.0, 261.0, 270.0, 271.0, 294.0, 302.0, 340.0, 343.0, 
354.0, 356.0, 357.0, 358.0, 0 // the second row. 
+0

Не могли бы вы поделиться результатами и ожидаемыми файлами ARFF? –

ответ

6

Код в примере рассматривает каждый столбец в таблице в качестве экземпляра (так что есть 29 экземпляров, каждый из которых с двумя атрибутами). Это звучит, как вы хотите, чтобы рассматривать каждую строку как экземпляр (дает два экземпляра, каждый из 29 атрибутов):

double[][] data = { 
        {4058.0, 4059.0, ... }, /* first instance */ 
        {19.0, 20.0, ... }  /* second instance */ 
        }; 

int numAtts = data[0].length; 
FastVector atts = new FastVector(numAtts); 
for (int att = 0; att < numAtts; att++) 
{ 
    atts.addElement(new Attribute("Attribute" + att, att)); 
} 

int numInstances = data.length; 
Instances dataset = new Instances("Dataset", atts, numInstances); 
for (int inst = 0; inst < numInstances; inst++) 
{ 
    dataset.add(new Instance(1.0, data[inst])); 
} 

BufferedWriter writer = new BufferedWriter(new FileWriter("test.arff")); 
writer.write(dataset.toString()); 
writer.flush(); 
writer.close(); 

я заменил SparseInstance с Instance, так как почти все значения атрибутов не равны нулю. Обратите внимание, что в Weka 3.7 Instance стал интерфейсом, и вместо этого следует использовать DenseInstance. Кроме того, FastVector устарел в пользу Java ArrayList.

+0

Ницца, именно то, что я хочу, спасибо! –

+0

thanx до максимума вы мне тоже помогли^_____ ^ –

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