在Java中计算多元正常CDF

时间:2013-01-06 02:43:28

标签: java math statistics distribution numeric

有没有人知道在Java中计算多变量法线(MVN)CDF的可靠,准确的库?我正在寻找像MATLAB's mvncdf function这样的东西。我需要能够达到10或更多的尺寸。大多数统计/数学库都没有此功能。能够计算对数概率是一个加号。

this post开始,似乎没有其他语言提及的免费实现。虽然直接java实现会摇滚,但我会接受其他语言中不需要许可证的实现(例如,不是MATLAB或IMSL),并且可以用最少的开销从Java轻松调用。

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

2 个答案:

答案 0 :(得分:4)

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

多变量正常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。这是一个非常好的数学库,直到现在还没有找到。

答案 1 :(得分:1)

添加到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”开始。 vs' 0',但这可以通过一个简单的包装函数轻松处理(如果你关心)。

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