Добавление экземпляра в экземпляры в weka

У меня есть несколько файлов arff. Я хотел бы прочитать их последовательно и создать большой набор данных. Instances.add(Instance inst) не добавляет строковые значения к экземплярам, ​​поэтому попытка setDataset()... но даже это не удается. Есть ли способ сделать интуитивно правильную вещь для строк?

                ArffLoader arffLoader = new ArffLoader();
                arffLoader.setFile(new File(fName));
                Instances newData = arffLoader.getDataSet();
                for (int i = 0; i < newData.numInstances(); i++) {
                        Instance one = newData.instance(i);
                        one.setDataset(data);
                        data.add(one);
                }

person fodon    schedule 06.06.2012    source источник
comment
Как это не удается? Что просходит? Если есть ошибка, отпишитесь. Кроме того, setDataset() не будет работать, если наборы данных не идентичны (например, если объекты расположены в другом порядке, произойдет сбой), а если наборы данных одинаковы, то нет необходимости установить набор данных.   -  person kaz    schedule 07.06.2012
comment
Ошибка в том, что строки не обновляются. Структуры данных идентичны.   -  person fodon    schedule 07.06.2012
comment
Я считаю, что все строки установлены на 0.   -  person fodon    schedule 07.06.2012
comment
Какие струны? String тип данных Java? Вы вставляете Instance в набор Instances, поэтому мне трудно понять, что вы имеете в виду. Что вы делаете, чтобы проверить, обновляются ли строки, о которых вы говорите? этот код может нам помочь.   -  person kaz    schedule 07.06.2012
comment
Экземпляр может иметь строковое поле. Обычно строки, добавленные в экземпляр, сохраняются в связанных экземплярах, а ссылка на отдельную строку добавляется в экземпляр для экономии памяти.   -  person fodon    schedule 07.06.2012


Ответы (1)


Это из списка рассылки. Я сохранил это раньше

как объединить два файла данных a.arff и b.arff в один список данных?

Зависит от того, о каком объединении вы говорите. Вы просто хотите добавить второй файл (оба имеют одинаковые атрибуты) или хотите добавить слияние атрибутов (оба имеют одинаковое количество экземпляров)?

In the first case ("append"): 
java weka.core.Instances append filename1 filename2 > output-file 

and the latter case ("merge"): 
java weka.core.Instances merge filename1 filename2 > output-file 

Вот соответствующий Javadoc: http://weka.sourceforge.net/doc.dev/weka/core/Instances.html#main(java.lang.String[])

Используйте mergeInstances для объединения двух наборов данных.

 public static Instances mergeInstances(Instances first,
                                   Instances second)

Ваш код будет примерно таким, как показано ниже. Для одинаковых номеров экземпляров.

ArffLoader arffLoader = new ArffLoader();
arffLoader.setFile(new File(fName1));
Instances newData1 = arffLoader.getDataSet();
arffLoader.setFile(new File(fName2));
Instances newData2 = arffLoader.getDataSet();
Instances mergedData = Instances.mergeInstances( newData1 ,newData2);       

Ваш код будет примерно таким, как показано ниже. Для одинаковых номеров атрибутов. Я не вижу никакого java-метода в weka. Если вы читаете код, есть что-то вроде ниже.

// Instances.java
//  public static void main(String[] args) {
// read two files, append them and print result to stdout
  else if ((args.length == 3) && (args[0].toLowerCase().equals("append"))) {
DataSource source1 = new DataSource(args[1]);
DataSource source2 = new DataSource(args[2]);
String msg = source1.getStructure().equalHeadersMsg(source2.getStructure());
if (msg != null)
  throw new Exception("The two datasets have different headers:\n" + msg);
Instances structure = source1.getStructure();
System.out.println(source1.getStructure());
while (source1.hasMoreElements(structure))
  System.out.println(source1.nextElement(structure));
structure = source2.getStructure();
while (source2.hasMoreElements(structure))
  System.out.println(source2.nextElement(structure));
  }
person Atilla Ozgur    schedule 07.06.2012
comment
Это близко, за исключением того, что оно предназначено для слияния наборов данных с одинаковым количеством экземпляров или горизонтальной конкатенации. Мне нужен метод для объединения наборов данных по вертикали. - person fodon; 07.06.2012
comment
Я на самом деле хочу структуру данных, подобную mergedData, а не распечатывать ее. - person fodon; 07.06.2012
comment
Вам нужно написать собственный код для него. Скорее всего, вам нужно использовать другую структуру данных для хранения экземпляров, а затем преобразовать ее. - person Atilla Ozgur; 07.06.2012
comment
Вау... звучит довольно запутанно. - person fodon; 07.06.2012
comment
Насколько я знаю. Может быть, метод существует, но я не знаю его. - person Atilla Ozgur; 07.06.2012
comment
давайте продолжим это обсуждение в чате - person Atilla Ozgur; 07.06.2012