【问题标题】:Compute the multivariate normal CDF in Java在 Java 中计算多元正态 CDF
【发布时间】:2012-12-20 04:01:19
【问题描述】:

有谁知道在 Java 中计算多元正态 (MVN) CDF 的可靠、准确的库?我正在寻找类似MATLAB's mvncdf function 的东西。我需要能够为最大 10 或更大的尺寸做到这一点。大多数统计/数学库没有这个功能。能够计算对数概率是一个加分项。

来自this post,似乎没有提到其他一些语言的免费实现。虽然直接 Java 实现会很不错,但我会接受其他不需要许可证的语言(例如,不是 MATLAB 或 IMSL)的实现,并且可以以最小的开销从 Java 轻松调用。

(这个问题是post on StackExchange math 的衍生问题,我试图计算正常随机变量的排序概率...如果您有兴趣尝试直接使用其他数学方法解决问题,请一定要检查一下。)

【问题讨论】:

    标签: java math statistics distribution numeric


    【解决方案1】:

    在做了一些额外的研究之后,似乎以下是最合理的方法。

    多元正态 CDF 计算起来并不简单(尤其是对于大维度),并且已经有几篇关于该主题的学术论文。 Alan Genz 教授有一堆 Fortran-77 子程序,可以计算各种多元密度和 CDF,可在他的页面上找到:http://www.math.wsu.edu/faculty/genz/software/software.html

    正如您从其中的一些代码中看到的那样,用另一种语言重新实现并不是一件轻而易举的事,这可能就是为什么除非有人付费才这样做的原因。大量的数学/数值编程是在研究层面在 Fortran 中完成的,所以这是大多数最好的代码所在。

    因此,为了获得最佳结果,最好直接使用 JNI 或 JNA 调用(本机编译的)Fortran 子例程。 JNA 似乎是最容易实现的,遵循以下说明:http://www.javaforge.com/wiki/66061。使用它和其他一些参考资料,我实现了 Java-JNA-Fortran 链接,以便能够调用 MVNEXP(预期值)和 MVNDST(cdf)子例程。你可以在这里查看代码:

    还要指出:对于一些二元分布和其他在公共数学中找不到的东西,确实存在本机 Java 代码;它改编自上面的来源:http://www.iro.umontreal.ca/~simardr/ssj/indexe.html。这是一个非常好的数学库,我直到现在才发现。

    【讨论】:

    • 如果您可以在 R 中做您需要的事情,您也许可以使用 rforge.net/JRI 从 Java 调用 R。
    • 上述的R实现都只是调用了原始的Fortran代码。我知道从 Java 调用 R 的几种方法;这有点慢,可能不是要走的路,除非你只需要使用一次或两次。
    • 如果您想要纯 java 解决方案,请尝试 f2j (fortran to java) 编译器:icl.cs.utk.edu/f2j;除了一些 nit 烦恼之外,您可以换行(比如数组从 '1' 与 '0' 开始),我发现它生成的代码非常可行(例如这个 minpack 库:www1.fpl.fs.fed.us/optimization/LmderTest_f77.html);如果你确实转换它,我会感兴趣
    • @MattS。如果他们能够转换大部分 BLAS 和 LAPACK,看起来很有希望。如果我最终进一步追求这一点,我一定会看看。您应该考虑发布您的评论作为答案;我会投赞成票,我认为这对任何寻找类似信息的人都有好处。
    • 我正在为 Scala 寻找多元正态累积分布函数,但 Java 也可以。我怎样才能使用你的代码?我可以直接使用你的 github 文件吗?我需要那些 Fortran 文件,对吗?你能指导一下怎么做吗?您的 github 中的文档不是那么广泛。谢谢。
    【解决方案2】:

    添加到 OP 的解决方案(例如:最好的选择是 fortran 代码,并且没有其他确定的代码接近),获得纯 java 库的一种方法是使用 f2j 编译器(fortran 到 java)http://icl.cs.utk.edu/f2j

    我发现它生成的代码非常可行(例如这个 minpack 库:http://www1.fpl.fs.fed.us/optimization/LmderTest_f77.html)。我记得的唯一烦恼是数组从“1”与“0”开始,但可以通过一个简单的包装函数轻松处理(如果你关心的话)。

    @Andrew:如果你转换它,我会感兴趣的!

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2018-03-05
      相关资源
      最近更新 更多