【问题标题】:How to calculate gammaln in Spark MLLib?如何计算 Spark MLLib 中的 gammaln?
【发布时间】:2018-04-27 12:39:19
【问题描述】:

我正在尝试在 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)

为此,我使用此处给出的 L-BFGS 算法https://spark.apache.org/docs/2.2.0/mllib-optimization.html

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

我不知道如何在 Spark 中计算 Γ(x)。是否有任何方法或其他优化库可用于计算 gamma 或 gamma log?请提出建议。

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

【问题讨论】:

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


    【解决方案1】:

    读取命令行输入 x 并打印 Gamma(x) 和 对数伽玛(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));
           }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 2016-01-02
      • 2017-10-11
      • 2018-10-31
      • 1970-01-01
      • 2017-03-08
      • 2015-09-12
      • 2017-02-17
      • 2016-03-07
      相关资源
      最近更新 更多