计算多变量法线的概率

时间:2013-02-27 19:28:18

标签: java python numpy probability normal-distribution

我的问题涉及数学问题和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.52.5 < y < 3.5相对于我平常概率密度函数的积分。

我想知道的事情:

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

我的推理:

在单变量法线中,可以简单地使用累积分布函数(或者甚至将其值存储为标准函数然后进行标准化),但遗憾的是,{m}形式的not to be形式为多变量。

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

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

2 个答案:

答案 0 :(得分:1)

如果您正在寻找probabiliy density function of a bivariate normal distribution,下面有几行可以完成这项工作:

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)

答案 1 :(得分:0)

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

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

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

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

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

1.3701244220201715e-06

计算出的概率为

class TestSomething(unittest.TestCase):
    def test_doSomething(self):
        self.fail()

    def test_doSomething(self):
        print("hello there")