有没有人知道Java中有一个可靠、准确的库来计算多变量正态(MVN) CDF?我在找像MATLAB's mvncdf function这样的东西。我需要能够做到它的维度高达10或更多。大多数统计/数学库都没有这个功能。能够计算对数概率是一个加号。
在this post中,似乎没有提到的一些其他语言的免费实现。虽然直接的Java实现会很棒,但我会接受不需要许可证的其他语言的实现(例如,不需要MATLAB或IMSL ),并且可以很容易地从Java调用,并且开销最小。
(这个问题是一个post on StackExchange math的导数,我正在尝试计算正态随机variables...if排序的概率,您有兴趣尝试使用其他数学方法直接解决此问题,请务必查看它。)
发布于 2013-01-07 06:23:01
在做了一些额外的研究之后,似乎下面的方法是最合理的。
多变量正态CDF的计算并不容易(特别是对于大维度),并且已经有几篇关于这个主题的学术论文。Alan Genz教授有一堆计算各种多变量密度和CDF的Fortran-77子例程,可以在他的页面上找到: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:https://github.com/mizzao/libmao/tree/master/src/main/java/net/andrewmao/probability
还要指出的是:对于一些二元分布和其他在commons数学中找不到的东西,确实存在原生Java代码;它是从上面的源代码http://www.iro.umontreal.ca/~simardr/ssj/indexe.html改编而来的。这是一个非常好的数学库,直到现在我才发现。
发布于 2014-07-08 10:30:19
除了OP的解决方案(例如:最好的选择是fortran代码,没有其他方法接近),获得纯java库的一种方法是使用f2j编译器(fortran to java) http://icl.cs.utk.edu/f2j
我发现它生成的代码是非常可行的(比如这个minpack库:http://www1.fpl.fs.fed.us/optimization/LmderTest_f77.html )。我记得唯一令人恼火的是数组从'1‘开始,而不是'0',但这可以通过一个简单的包装器函数轻松处理(如果你关心的话)。
@Andrew:如果你真的转换它,我会很感兴趣!
https://stackoverflow.com/questions/14178759
复制相似问题