Poisson-Verteilung in OnlineBoosting

fraggle!

New member
Hallo Leute!

Lese mir gerade folgendes Paper durch:
http://ti.arc.nasa.gov/m/profile/oza/files/ozru01a.pdf

Im OnlineBoosting Pseudocode heisst es in einem Schritt:
"Setze k entsprechend Poisson(lambda)"

An dieser Stelle habe ich noch etwas Verstaendnisprobleme
wie ich an das k herankommen soll. Es laesst sich auf dem
ersten Blick lesen wie:

k = Poisson(lambda)

Aber ich vermute mal es ist damit eher die Anzahl der Ereignisse
k der Poisson-Verteilung gemeint oder? Falls ja dann verwirrt mich das auch weil ich ja dann die Wahrscheinlichkeit fuer Poisson(lambda) braeuchte um nach k aufzuloesen oder nicht?

Wollte das ganze mal verstanden haben um eine AdaBoost Implementation die ich aus dem Netz habe (Antonio Gulli's coding playground: Adaboost : improve your weak performance) zu modifzieren und das ganze mal selber auszuprobieren.

Danke schonmal im voraus!
 

fraggle!

New member
Habe jetzt herausbekommen wie man an den Wert k herankommt. Musste
meine Suchbegriffe etwas modifizieren und wurde mit "Ozaboost" dann fündig.

Habe das MOA Data Mining Framework entdeckt das die Online-Boosting Variante enthält.

Für die jenigen die das vielleicht auch interessiert, nachfolgend der Trainingsvorgang und die Berechnung des Wertes k.

OnlineBoosting (nach Oza und Russell)
Code:
public void trainOnInstanceImpl(Instance inst)
  {
    double lambda_d = 1.0D;
    for (int i = 0; i < this.ensemble.length; i++) {
      double k = this.pureBoostOption.isSet() ? lambda_d : MiscUtils.poisson(lambda_d, this.classifierRandom);
      if (k > 0.0D) {
        Instance weightedInst = (Instance)inst.copy();
        weightedInst.setWeight(inst.weight() * k);
        this.ensemble[i].trainOnInstance(weightedInst);
      }
      if (this.ensemble[i].correctlyClassifies(inst)) {
        this.scms[i] += lambda_d;
        lambda_d *= this.trainingWeightSeenByModel / (2.0D * this.scms[i]);
      } else {
        this.swms[i] += lambda_d;
        lambda_d *= this.trainingWeightSeenByModel / (2.0D * this.swms[i]);
      }
    }
  }


k = Poisson(lambda,randomseed)

Code:
public static int poisson(double lambda, Random r) {
    if (lambda < 100.0D) {
      double product = 1.0D;
      double sum = 1.0D;
      double threshold = r.nextDouble() * Math.exp(lambda);
      int i = 1;
      int max = Math.max(100, 10 * (int)Math.ceil(lambda));
      while ((i < max) && (sum <= threshold)) {
        product *= lambda / i;
        sum += product;
        i++;
      }
      return i - 1;
    }
    double x = lambda + Math.sqrt(lambda) * r.nextGaussian();
    if (x < 0.0D) {
      return 0;
    }
    return (int)Math.floor(x);
  }

Auf ne Zufallszahl wäre ich jetzt nicht gekommen, wird ja auch nichts davon erwähnt oder ist es doch offensichtlich?

Naja trotzdem mal danke fürs anschauen! :)
 

Chromatin

Moderator
Mitarbeiter
Was ist denn das überaupt, bzw. wozu ist das gut. Ich bin durch das PDF nicht schlauer geworden :D
 

fraggle!

New member
Das ist aus der Machine Learning Ecke.
Boosting ist ein Verfahren das aus mehreren schwachen Klassifizierern einen starken Klassifizierer bildet.

AdaBoost ist bspw. so ein Boosting Algorithmus. Dieser benötigt als Input eine beliebige Menge an Trainingsdaten und die schwachen Klassifizierer (z.B. ein Entscheidungsbaum der zu der Frage "Enthält das Bild runde Objekte?" entweder 1 oder -1 zurückliefert). Mit den Trainingsdaten sollen die schwachen Klassifizierer trainiert werden, es wird anschließend nach dem Trainingsvorgang je nach Ergebnis eine bestimmte Gewichtung an die Klassifizierer vergeben. Mit Hilfe dieser Gewichtung kann durch eine bestimmte Kombination der Klassifizierer ein neuer starker Klassifizier gebildet werden. So funktioniert die "Offline" Variante, welches eben Trainingsdaten voraussetzt.

Mit der Online Variante dieses Boosting-Verfahrens wären diese Trainingsdaten hinfällig und das zu klassifizierende "etwas" kann direkt
dem Algorithmus übergeben werden. Wenn ich die oben verlinkte Arbeit richtig verstehe wird versucht mit Hilfe einer Poisson-Verteilung diese
Gewichtung die beim Boosting-Verfahren entscheidend ist weiterhin zu ermöglichen.

Hier mal ein praktisches Beispiel für AdaBoost:
Adaboost on OpenCV 2.3 | From thesis to comics
 
Oben