我正在尝试在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数学库吗?
答案 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));
}
}