2016-02-10 4 views
0

Je suis en train de créer une nouvelle formation définie dans Weka comme ceci:WEKA - ArrayIndexOutOfBoundsException: 1

Attribute numAtt = new Attribute("numAtt"); 
    ArrayList<String> classLabels = new ArrayList<String>(); 
    classLabels.add("positive"); 
    classLabels.add("negative"); 
    Attribute classAtt = new Attribute("class", classLabels); 

    ArrayList<Attribute> atts = new ArrayList<Attribute>(); 
    atts.add(numAtt); 
    atts.add(classAtt); 
    Instances myInstances = new Instances("myRelation", atts, 0); 
    myInstances.setClassIndex(1); 

    for(int i = 0; i < myList.size(); i++){ 
     if (i >= posSIndex && i <= posEIndex) { 
      Instance inst = new DenseInstance(1.0, myList.get(i)); 
      inst.setDataset(myInstances); 
      inst.setClassValue("positive"); 
      myInstances.add(inst); 
      inst = null; 
     } else { 
      Instance inst = new DenseInstance(1.0, myList.get(i)); 
      inst.setDataset(myInstances); 
      inst.setClassValue("negative"); 
      myInstances.add(inst); 
      inst = null; 
     } 
    } 

Je reçois l'erreur suivante:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at weka.core.DenseInstance.setValue(DenseInstance.java:245) 
    at weka.core.AbstractInstance.setValue(AbstractInstance.java:514) 
    at weka.core.AbstractInstance.setClassValue(AbstractInstance.java:435) 
    at testApp.Main.classPosNeg(Main.java:914) 
    at testApp.Main.buildInstances(Main.java:885) 
    at testApp.Main.main(Main.java:382) 

Mes doubles tableaux myList.get(i) ont un fixe longueur de 100.000 doubles valeurs chacune. Je veux construire une DenseInstance à partir de chaque double tableau, lui donner une classe (propriété positive ou négative) et l'ajouter à l'objet Instances. Le jeu d'instances sera utilisé pour construire un modèle SVM. Je pense que je fais quelque chose de terriblement mal. Toute aide avec ceci serait très appréciée.

Merci.

EDIT 1:

problème est lié à cette ligne au moment:

Ligne 914:inst.setClassValue("positive");

EDIT 2:

Pour clarifier myList déclaration :

public static List <double[]> myList = new LinkedList<double[]>(); 

EDIT 3: J'ai enfin eu un peu de temps pour essayer la solution qui @Marcin Gumkowski a suggéré et a changé mon code pour:

for(int i = 0; i < myList.size(); i++){ 
     if (i >= posSIndex && i <= posEIndex) { 
      Instance instance = new DenseInstance(100001); 
      for (int e = 0; e <= 100000; e++) 
       instance.setValue(e, myList.get(i)[e]); 
      instance.setValue(100001, "positive"); 
      myInstances.add(instance); 
      instance = null; 
     } else { 
      Instance instance = new DenseInstance(100001); 
      for (int e = 0; e <= 100000; e++) 
       instance.setValue(e, myList.get(i)[e]); 
      instance.setValue(100001, "negative"); 
      myInstances.add(instance); 
      instance = null; 
     } 

... et maintenant je reçois le erreur suivant:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
    at testApp.Main.classPosNeg(Main.java:924) 
    at testApp.Main.buildInstances(Main.java:884) 
    at testApp.Main.main(Main.java:381) 

ligne 924:instance.setValue(e, myList.get(i)[e]);

La solution ne fonctionne donc pas pour mon problème. Je vais commencer à partir de zéro et vérifier toutes mes tailles de tableau, etc. pour voir si j'ai mal intentionnellement mal calculé quelque chose.

EDIT 4: J'ai finalement trouvé la vraie source de mon erreur. J'ai découvert que, dans l'une de mes fonctions précédentes, j'ai fait des erreurs de calcul dans certaines instructions conditionnelles qui remplissaient ou effaçaient mes tableaux préparés pour l'insertion myList. La sortie de ma console m'a montré que j'ai eu 100.000 valeurs dans chacun de mes tableaux mais la vérité était qu'ils ont été effacés avant insertion dans l'objet myList à cause de mon calcul conditionnel. erreurs après. J'ai corrigé ces erreurs et testé ma solution originale.

Ceci est mon code à nouveau avec quelques modifications:

private static void classPosNeg(int posSIndex, int posEIndex) { 
    ArrayList<Attribute> atts = new ArrayList<Attribute>(2); 
    ArrayList<String> classVal = new ArrayList<String>(); 
    classVal.add("positive"); 
    classVal.add("negative"); 
    atts.add(new Attribute("numAtt")); 
    atts.add(new Attribute("@@[email protected]@",classVal)); 

    Instances myInstances = new Instances("myRelation", atts, 2); 
    myInstances.setClassIndex(1); 

    for(int i = 0; i < myList.size(); i++){ 
     if (i >= posSIndex && i <= posEIndex) { 
      Instance inst = new DenseInstance(10.0, myList.get(i)); 
      inst.setDataset(myInstances); 
      inst.setClassValue("positive"); 
      myInstances.add(inst); 
     } else { 
      Instance inst = new DenseInstance(1.0, myList.get(i)); 
      inst.setDataset(myInstances); 
      inst.setClassValue("negative"); 
      myInstances.add(inst); 
     } 
    } 
    System.out.println("Instances: "+myInstances.numInstances()); 
    System.out.println("Classes: "+myInstances.numClasses()); 
    System.out.println("Attributes: "+myInstances.numAttributes()); 
} 

Et la sortie de deux insertion d'échantillons était:

Instances: 2 
Classes: 2 
Attributes: 2 

Premier échantillon a été inséré dans la classe de points positifs et le second était inséré de la classe des négatifs. Chaque Instance a un tableau de 100.000 valeurs et un nom de classe (positif ou négatif).

Merci à tous!

+0

qui est la ligne 245 – Abdelhak

+1

@Abdelhak ... qui est classe weka.core.DenseInstance. C'est un cours de bibliothèque que j'utilise. – c00ki3s

Répondre

2

Vérifiez votre DenseInstance constructeur. Vous devriez transmettre ces paramètres.

DenseInstance(double weight, double[] attValues) 

Constructeur qui initie la variable d'instance avec des valeurs données. Je ne sais pas ce qui est dans le myList. Vérifiez d'abord votre myList. Vous pouvez toujours essayer de le faire comme ceci:

Instance instance = new DenseInstance(attributes.size()); 
instance.setValue(0, "something"); 
instance.setValue(1, "positive"); 

source: http://weka.sourceforge.net/doc.dev/weka/core/DenseInstance.html

+0

J'ai peut-être mal calculé la longueur des réseaux fusionnés à un moment donné. Va vérifier cela en premier. – c00ki3s

+0

En effet, c'était un problème avec l'objet 'myList'. J'ai ajouté le dernier edit et une explication. Veuillez éditer votre message afin que je puisse lui donner un "feu vert", parce que vous avez fait avancer le problème myList. Merci encore. – c00ki3s