6

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

这篇文章中,似乎没有提到其他一些语言的免费实现。虽然直接的 java 实现会动摇,但我会接受其他不需要许可证的语言(例如,不是 MATLAB 或 IMSL)的实现,并且可以以最小的开销从 Java 轻松调用。

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

4

2 回答 2

5

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

多元正态 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 。这是一个非常好的数学库,我直到现在才发现。

于 2013-01-06T22:23:01.227 回答
1

添加到 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:如果你转换它,我会感兴趣的!

于 2014-07-08T02:30:18.967 回答