在 Java 中计算多元正态 CDF

2024-03-20

有谁知道有一个可靠、准确的库来计算 Java 中的多元正态 (MVN) CDF?我正在寻找类似的东西MATLAB mvnpdf 函数 http://www.mathworks.com/help/stats/mvncdf.html。我需要能够对最多 10 个或更多的维度执行此操作。大多数统计/数学库没有此功能。能够计算对数概率是一个优势。

From 这个帖子 https://stackoverflow.com/questions/11109465/multivariate-normal-cdf-in-c-c-or-fortran,似乎没有提到其他一些语言的免费实现。虽然直接的 Java 实现会很糟糕,但我会接受其他语言的实现,这些语言不需要许可证(例如,不需要 MATLAB 或 IMSL)并且可以以最小的开销轻松地从 Java 调用。

(这个问题是一个衍生问题在 StackExchange 数学上发表文章 https://math.stackexchange.com/questions/270745/compute-probability-of-a-particular-ordering-of-normal-random-variables我试图计算正态随机变量排序的概率...如果您有兴趣尝试使用其他数学方法直接解决问题,请检查一下。)


经过一些额外的研究后,似乎以下是最合理的方法。

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

正如您从其中一些代码中看到的那样,用另一种语言重新实现并不完全是小菜一碟,这可能就是为什么除非有人付费否则它还没有完成的原因。许多数学/数值编程都是在研究级别上用 Fortran 完成的,所以这就是大多数最好的代码所在的地方。

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

  • Java: https://github.com/mizzao/libmao/tree/master/src/main/java/net/andrewmao/probability https://github.com/mizzao/libmao/tree/master/src/main/java/net/andrewmao/probability
  • Fortran(已修改)和 Makefile:https://github.com/mizzao/libmao/tree/master/src/main/fortran https://github.com/mizzao/libmao/tree/master/src/main/fortran

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中计算多元正态 CDF 的相关文章

随机推荐