2013-10-12 5 views
2

Я новичок в Weka, я собираюсь создать новые экземпляры, которые будут помечены предыдущим обработанным MultilayerPerceptron, я не очень много знал о том, как создать экземпляр, поэтому я получил первый экземпляр из моих обучающих данных, а затем у модифицировал его, изменяя значения atributes:Создать новый weka Экземпляр

//Opening the model 
public boolean abrirModelo(String ruta) { 
    try { 

     clasificador = (MultilayerPerceptron) weka.core.SerializationHelper.read(ruta); 

     return true; 
    } catch (IOException e) { 
     System.out.println("Fallo la lectura del archivo"); 
     return false; 
    } catch (ClassNotFoundException a) { 
     System.out.println("Fallo el casting"); 
     return false; 
    }catch(Exception e){ 
     System.out.println("Error con el castingo"); 
     return false; 
    } 
} 

//getting the first instance to be modified 
public boolean inicializarInstancias(String directorio){ 
    archivo = new ArffLoader(); 
    try { 
     archivo.setFile(new File(directorio)); 
     structure = archivo.getStructure(); 
     structure.setClassIndex(structure.numAttributes() - 1); 
     actual = archivo.getNextInstance(structure); //instance to be used 
    } catch (IOException ex) { 
     System.out.println("Algo salio mal al cargar la estructura de lsa instancias"); 
    } 
    return true; 
} 

//creating an instance from my local data using the previous instantiated actual instance, it is a List of Points with x and y 
public Instance convertir(LineaDeArchivo line) { 
    int size = line.getDatos().size(); 
    for (int i = 0; i < size; i+=2) { 
     actual.setValue(i, line.getDatos().get(i).x); 
     actual.setValue(i + 1, line.getDatos().get(i).y); 
    } 
    return actual; 
} 
//getting the class 
public String getClase(Instance e){ 
    try{ 
     double clase; 
     clase = clasificador.classifyInstance(e); 
     return structure.classAttribute().value((int) clase); 
    }catch(Exception a){ 
     System.out.println("Algo salio mal con la clasificacion"); 
     return "?"; 
    } 

} 

Может быть это не правильный способ сделать это, то clasifiers получает то же значение класса для всех экземпляров, которые я даю, я думаю, проблема в том, как я создаю экземпляр.

Я надеюсь, что кто-то может дать мне совет, спасибо заранее

ответ

-1

Этот link показывает, как Weka предлагает построить новый экземпляр.

Если вы хотите придерживаться своего кода и посмотреть, работает ли он, вы можете попробовать создать несколько экземпляров вручную. Затем вы можете классифицировать экземпляры, чтобы увидеть, получился ли тот же результат, что и с экземпляром, созданным с помощью вашего метода.

Чтобы создать несколько экземпляров вручную вы:

  1. Создать физическую копию существующих «.arff» обучающих данных
  2. Открыть копию с помощью текстового редактора
  3. Редактировать и сохранить X и значения Y, как вы сочтете нужным

Если эти экземпляры классифицируются по-разному, то те, которые вы модифицируете с помощью своего кода, можете быть уверены, что экземпляры не создаются правильно.

0

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

//assuming we already have arff loaded in a variable called dataset 
Instance newInstance = new Instance(); 
for(int i = 0 ; i < dataset.numAttributes() ; i++) 
{ 

    newInstance.setValue(i , value); 
    //i is the index of attribute 
    //value is the value that you want to set 
} 
//add the new instance to the main dataset at the last position 
dataset.add(newInstance); 
//repeat as necessary 
+5

Я не знаю, как это был год идти, но теперь Instance() конструктор защищен, что означает, что вы не можете его использовать. Для получения дополнительной информации проверьте API: http://weka.sourceforge.net/doc.stable/ (вам все равно придется самостоятельно перейти к документации по экземпляру) – Mackiavelli

+0

Должно быть возможно использование 'new SparseInstance()' или 'new Вместо этого DenseInstance(). – glaed

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