java - 计算多元正态分布的概率

标签 java python numpy probability normal-distribution

我的问题涉及数学和计算机科学问题,但由于我需要一个高性能的实现,所以我将其发布在这里。

问题:

我有一个估计的正态二元分布,定义为 python 矩阵,但随后我需要在 Java 中转置相同的计算。 (此处为虚拟值)

mean = numpy.matrix([[0],[0]])
cov = numpy.matrix([[1,0],[0,1]])

当我在 inupt 中收到整数值 (x,y) 的列 vector 时,我想计算给定元组的概率。

value = numpy.matrix([[4],[3]])
probability_of_value_given_the_distribution = ???

现在,从数学的角度来看,这将是 3.5 < x < 4.5 的积分和2.5 < y < 3.5超过我正常的概率密度函数。

我想知道:

有没有办法避免这种情况的有效实现,这意味着处理在矩阵和双积分上定义的表达式?除此之外,如果我必须自己实现它,这将花费我一段时间,这在计算上会很昂贵。一个近似的解决方案对我来说是完美的。

我的推理:

在单变量正态中,可以简单地使用累积分布函数(甚至存储标准函数的值然后标准化),但不幸的是出现 not to be多元变量的封闭 cdf 形式。

单变量的另一种方法是使用bivariate approximation的逆(因此,将正态近似为二项式),但是将其扩展到多元变量我无法弄清楚如何计算协方差。

我真的希望有人已经实现了这个,我很快就需要它(完成我的论文),但我找不到任何东西。

最佳答案

OpenTURNS 提供了多重正态分布 CDF 的有效实现(请参阅 code)。

import numpy as np

mean = np.array([0.0, 0.0])
cov = np.array([[1.0, 0.0],[0.0, 1.0]])

让我们使用这些参数创建多重正态分布。

import openturns as ot
multinormal = ot.Normal(mean, ot.CovarianceMatrix(cov))

现在让我们计算平方 [3.5, 4.5] x |2.5, 3.5] 的概率:

prob = multinormal.computeProbability(ot.Interval([3.5,2.5], [4.5,3.5])) 
print(prob)

计算出的概率为

1.3701244220201715e-06

关于java - 计算多元正态分布的概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120662/

相关文章:

python - 如何在 python 中迭代多维任意列表

python - 如何有效地切片 numpy 数组

python - 如何使用python维护数组中数字出现的顺序?

java - 关键字 "transient"在 Java 中是什么意思?

java - 无法配置 Spring Security 加载 .loginPage ("/login")只有默认页面有效或发送到/templates/index.html

java - 如何使用 JDOM 解析 SOAP

python - 如何在python opencv中保存光流输出?

python - 如何从 Flask 中的配置文件导入?

python - 以 numpy 数组为对象的 Numpy 数组

java - 使用 Apache Commons Configuration 进行变量插值,即 ${variable},带有属性文件中的值列表