2

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

问题:

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

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

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

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

现在,从数学的角度来看,这将是我的法线概率密度函数的3.5 < x < 4.5积分2.5 < y < 3.5

我想知道的:

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

我的理由:

在单变量正态中,可以简单地使用累积分布函数(或者甚至将其值存储为标准函数,然后进行归一化),但不幸的是,多元变量似乎没有封闭的 cdf 形式。

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

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

4

2 回答 2

2

OpenTURNS 提供了多正态分布的 CDF 的有效实现(参见代码)。

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
于 2020-10-09T23:31:56.653 回答
1

如果您正在寻找二元正态分布的概率密度函数,以下是可以完成这项工作的几行代码:

import numpy as np

def multivariate_pdf(vector, mean, cov):
    quadratic_form = np.dot(np.dot(vector-mean,np.linalg.inv(cov)),np.transpose(vector-mean))
    return np.exp(-.5 * quadratic_form)/ (2*np.pi * np.linalg.det(cov))

mean = np.array([0,0])
cov = np.array([[1,0],[0,1]])
vector = np.array([4,3])

pdf = multivariate_pdf(vector, mean, cov)
于 2013-02-27T20:45:00.990 回答