如何在Spark MLLib中计算gammaln?

时间:2017-11-14 14:10:56

标签: java apache-spark statistics apache-spark-mllib

我正在尝试在Spark MLLib中实现Buytillyoudie模型的对数似然函数。

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

其中

  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)

为此,我使用的是https://spark.apache.org/docs/2.2.0/mllib-optimization.html

中给出的L-BFGS算法

我正在实现一个自定义的Gradient类,要传递给L-BFGS方法LBFGS.runLBFGS

我不知道如何计算Spark中的Γ(x)。是否有任何方法或其他优化库可用于计算伽玛或伽马记录?请建议。

PS:我从评论部分得到一个提示,使用Scala的Breeze库。但是因为我使用Java,所以不可能。我可以在Java中使用 ND4J或Apache-commons数学库吗?

1 个答案:

答案 0 :(得分:0)

读入命令行输入x并打印Gamma(x)和 记录Gamma(x)。 Gamma功能定义如下:  Gamma(x)=积分(t ^(x-1)e ^( - t),t = 0 ..无穷大)

 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));
       }

    }