用Java计算多元正态CDF

用Java计算多元正态CDF,java,math,statistics,distribution,numeric,Java,Math,Statistics,Distribution,Numeric,有没有人知道一个可靠、准确的库来计算Java中的多变量正态分布(MVN)CDF?我在找类似的东西。我需要能够做到的尺寸高达10或更多。大多数统计/数学库都没有此功能。能够计算对数概率是一个加号 从一开始,似乎没有提到其他一些语言的免费实现。虽然一个直接的java实现会令人震惊,但我会接受其他语言的实现,这些语言不需要许可证(例如,不是MATLAB或IMSL),并且可以用最小的开销从java轻松调用 (这个问题是a的导数,我试图计算正态随机变量排序的概率…如果您有兴趣尝试直接使用其他数学方法解决问

有没有人知道一个可靠、准确的库来计算Java中的多变量正态分布(MVN)CDF?我在找类似的东西。我需要能够做到的尺寸高达10或更多。大多数统计/数学库都没有此功能。能够计算对数概率是一个加号

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


(这个问题是a的导数,我试图计算正态随机变量排序的概率…如果您有兴趣尝试直接使用其他数学方法解决问题,请检查一下。)

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

多元正态CDF的计算并不简单(特别是对于大维度),已经有几篇关于这个主题的学术论文。Alan Genz教授有一系列Fortran-77子程序,用于计算各种多元密度和CDF,可在其页面上找到:

从一些代码中可以看出,用另一种语言重新实现并不容易,这可能就是为什么除非有人为此付费,否则无法实现的原因。在研究阶段,很多数学/数值编程都是用Fortran编写的,所以大部分最好的代码都是在Fortran中编写的

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

  • 爪哇:
  • Fortran(已修改)和Makefile:

还要指出的是:对于某些二元分布和其他在commons math中找不到的东西,确实存在本机Java代码;它是根据上面的来源改编的:。这是一个非常好的数学库,我到目前为止还并没有找到。

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

我发现它生成的代码非常可行(例如,这个minpack库:)。我记得唯一的烦恼是数组从“1”开始而不是从“0”开始,但是这可以通过一个简单的包装函数轻松地处理(如果您愿意的话)


@安德鲁:如果你真的转换它,我会感兴趣的

如果您可以在R中执行所需的操作,那么您可能可以使用从Java调用R。我知道有几种从Java调用R的方法;它有点慢,除非你只需要使用一两次,否则可能不是一种好方法;除了一些你可以用纸包装的nit麻烦(比如数组从'1'和'0'开始),我发现它生成的代码非常可行(例如,这个minpack库:);如果你真的转换了,我会interested@MattS. 如果他们能转化大部分布拉斯和拉帕克,看起来很有希望。如果我继续下去,我一定会看一看的。你应该考虑发表评论作为答案;我会投票支持它,我认为这对其他任何寻找类似信息的人都有好处。我正在搜索Scala的多元正态累积分布函数,但Java也可以。如何使用您的代码?我可以直接使用你的github文件吗?我需要那些Fortran文件,对吗?你能告诉我怎么做吗?github中的文档没有那么广泛。非常感谢。