2017-11-07 4 views
2

Ich habe folgende Predictor-Klasse, die eine predict() Methode implementiert:Probleme beim Anwenden einer Methode auf einen Strom von Floating Numbers Array?

class Predictor { 

    public static int predict(double[] atts) { 
     if (atts.length != 3) { 
      return -1; 
     } 
     int i, j; 

     ; 

     for (i = 0; i < 2; i++) { 
      double sum = 0.; 
      for (j = 0; j < 3; j++) { 
       sum += Math.log(2. * Math.PI * sigmas[i][j]); 
      } 
      double nij = -0.5 * sum; 
      sum = 0.; 
      for (j = 0; j < 3; j++) { 
       sum += Math.pow(atts[j] - thetas[i][j], 2.)/sigmas[i][j]; 
      } 
      nij -= 0.5 * sum; 
      likelihoods[i] = Math.log(priors[i]) + nij; 
     } 

     double highestLikeli = Double.NEGATIVE_INFINITY; 
     int classIndex = -1; 
     for (i = 0; i < 2; i++) { 
      if (likelihoods[i] > highestLikeli) { 
       highestLikeli = likelihoods[i]; 
       classIndex = i; 
      } 
     } 
     return classIndex; 
    } 

    public static void main(String[] args) { 
     if (args.length == 3) { 
      double[] atts = new double[args.length]; 
      for (int i = 0, l = args.length; i < l; i++) { 
       atts[i] = Double.parseDouble(args[i]); 
      } 
      System.out.println(Predictor.predict(atts)); 
     } 
    } 
} 

vorherzusagen Verfahren eine Anzahl Etikettenvorhersagt (d int number 0 oder 1). Welche verwende ich in einer Android-App, um eine Reihe von Floats predict die Nummer Label eines solchen Array von Schwimmern gegeben. Optisch sieht das wie folgt aus:

die
arrayOfFloats -> predict_method -> Label(0/1) 

Hinweis, arrayOfFloats ist ein Strom von Daten (konsekutiv ich mehrere dieser Arrays haben). Hier

ist der Code:

public void run() { //stuff that updates ui 
    finalValues = String.format("%s, %s, %s, %s, %s, %s\n", rollValue, pitchValue, yawValue, gxValue, gyValue, gzValue); 
    //finalValues = String.format("%s, %s, %s\n", rollValue, pitchValue, yawValue); 

    Log.e("WalkingActivity", finalValues); 

    WalkingLog.setText(finalValues); 

    // Classifier 
    values[0] = rollValue; 
    values[1] = pitchValue; 
    values[2] = yawValue; 
    //values[3] = gxValue; 
    //values[4] = gyValue; 
    //values[5] = gzValue; 

    int y_pred = Brain.predict(values); 

    ClassifierLog.setText(Integer.toString(y_pred)); 

    System.out.println("pred: " + Integer.toString(y_pred)); 

    int counter = 0; 

    //Simple threshold 
    if (rollValue < -40 && rollValue > -80 
     && pitchValue < 0 && yawValue > 0 
     && gxValue < 1000 && gxValue > -2000 
     && gyValue < 500 && gyValue > -1000 
     && gzValue < 1000 && gzValue > -2000) { 
     ClassifierLog.setText("N");             
     System.out.println("COUNTER: " + counter); 

    } else { 
     counter++;           
     ClassifierLog.setText("W");            
     System.out.println("COUNTER: " + counter); 
    } 
} 

Das Problem mit dem obigen Code ist, dass ich immer die gleiche Anzahl Etikett bekommen 1 (I die gleiche Anzahl bin der Vorhersage) statt einen anderen Ausgang bekommen 0 oder 1 . Soweit ich weiß, muss ich alle Float-Werte in einem einzigen Array anfügen. Obwohl ich versuche, ein solches Array an die Vorhersage-Methode zu übergeben, funktioniert es nicht. Allerdings ist es nicht funktioniert, was der richtige Weg ist, um die predict Methode aus der Predictor Klasse zu verwenden ?,

+1

Ich habe keine Ahnung, was Sie versuchen oder zu tun, was Sie fragen. Bitte erläutern. – shmosel

+2

Was der Prädiktor vorherzusagen hat. – shmosel

+0

Das ist eine Menge Code, um 0 oder 1 zurückzugeben. Und wo kommt 'Atts' ins Bild? – shmosel

Antwort

3

Der beste Weg, um eine Lösung zu erhalten, ist & vorhanden, um eine sehr kleine Java-Klasse zu erstellen, die laufen und enthält nur die nackten Grundlagen des Problems, das Sie gelöst haben möchten (einschließlich der Eingaben). Es wird zwar einige Anstrengungen erfordern, aber es wird klar vermitteln, was Sie zu erreichen versuchen. Siehe mein Beispiel unten.

Meine beste Schätzung ist, dass Sie einfach nur ein Array von drei Werten übergeben und ein einzelnes Ergebnis zurückgeben möchten. Wenn dies der Fall ist, zeigt Ihr erstes Codebeispiel, dass Sie das bereits richtig machen.

Daher ist Ihr Problem, immer 1 zurückzugeben, in der Logik des Predictor-Codes selbst; d. h. die Sigma/Theta-Logik (die Sie ihre Werte nicht übermittelt haben). Wenn Sie jedoch wissen, dass Sie die Werte korrekt eingeben, müssen Sie nur die Sigma/Theta-Logik debuggen. Zum Beispiel, nach der if-Anweisung in der highestLikeli Schleife, eine SYSOUT hinzufügen:

 

    System.out.format("%d %f %f\n",classIndex,highestLikeli,likelihoods[i]); 

als Referenz, hier ist eine kleine Java-Datei, um den Array-Wert zeigt, die in übergeben wird und der Prädiktor-Wert wird ohnmächtig wird (was, was ist Du Frage scheint zu sein).



    public class Test { 

     public static void main(String[] args) { 
      String params[][] = { { "3.3", "4.4", "5.5" }, { "5.5", "3.3", "4.4" }, { "4.4", "5.5", "3.3" } }; 
      for (int i = 0; i < params[0].length; i++) { 
       System.out.format("%d: %s, %s, %s => ", i, params[i][0], params[i][1], params[i][2]); 
       Predictor.main(params[i]); 
      } 
     } 

     static class Predictor { 

      // Simplistic example taking 3 values and returning the index of the largest. 
      public static int predict(double[] atts) { 
       double highestLikeli = Double.NEGATIVE_INFINITY; 
       int classIndex = -1; 
       for (int i = 0; i < atts.length; i++) { 
        if (atts[i] > highestLikeli) { 
         highestLikeli = atts[i]; 
         classIndex = i; 
        } 
       } 
       return classIndex; 
      } 

      public static void main(String[] args) { 
       if (args.length == 3) { 
        double[] atts = new double[args.length]; 
        for (int i = 0; i&ltargs.length; i++) { 
         atts[i] = Double.parseDouble(args[i]); 
        } 
        System.out.println(Predictor.predict(atts)); 
       } 
      } 
     } 
    } 

Ergebnisse

 

    0: 3.3, 4.4, 5.5 => 2 
    1: 5.5, 3.3, 4.4 => 0 
    2: 4.4, 5.5, 3.3 => 1 

Verwandte Themen