2017-11-14 5 views
0

Ich versuche Log-Likelihood-Funktion von Buytillyoudie Modell in Spark MLLib zu implementieren.Wie berechnet man Gammaln in Spark MLLib?

L(r, α, a, b |X = x, tx, T) = A1 · A2 · (A3 + δx>0 A4)

wo

A1 = Γ(r + x)αr/Γ(r) 
    A2 = Γ(a + b)Γ(b + x)/(Γ(b)Γ(a + b + x)) 
    A3 = (1/(α + T))^(r+x) 
    A4 = (a/(b+x-1))(1/(α + tx))^(r+x) 

Dazu verwende ich L-BFGS Algorithmus wie hier gegeben https://spark.apache.org/docs/2.2.0/mllib-optimization.html

ich eine benutzerdefinierte Gradient Klasse bin der Umsetzung weitergegeben werden, um L-BFGS Methode LBFGS.runLBFGS.

Ich kann nicht in Spark berechnen. Gibt es eine Methode oder eine andere Optimierungsbibliothek, mit der ich Gamma- oder Gammablog berechnen kann? Bitte vorschlagen.

PS: Ich habe ein Stichwort aus dem Kommentarabschnitt zu Breeze-Bibliothek von Scala verwenden. Aber da ich Java benutze, ist das nicht möglich. Kann ich ND4J oder Apache-Commons Mathematikbibliothek in Java verwenden?

Antwort

0

Liest in einer Befehlszeile den Eingang x und gibt Gamma (x) und log Gamma (x) aus. Die Gamma-Funktion ist definiert durch: Gamma (x) = ganzzahlig (t^(x-1) e^(-t), t = 0 .. unendlich)

public class Gamma { 

     static double logGamma(double x) { 
      double tmp = (x - 0.5) * Math.log(x + 4.5) - (x + 4.5); 
      double ser = 1.0 + 76.18009173 /(x + 0) - 86.50532033 /(x + 1) 
          + 24.01409822 /(x + 2) - 1.231739516 /(x + 3) 
          + 0.00120858003/(x + 4) - 0.00000536382/(x + 5); 
      return tmp + Math.log(ser * Math.sqrt(2 * Math.PI)); 
     } 
     static double gamma(double x) { return Math.exp(logGamma(x)); } 

     public static void main(String[] args) { 
      double x = Double.parseDouble(args[0]); 
      StdOut.println("Gamma(" + x + ") = " + gamma(x)); 
      StdOut.println("log Gamma(" + x + ") = " + logGamma(x)); 
     } 

    } 
Verwandte Themen