我的问题涉及数学问题和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
相对于我平常概率密度函数的积分。
我想知道的事情:
有没有办法避免有效实现这一点,这意味着处理在矩阵和双积分上定义的表达式?除此之外,如果我必须自己实现它,我需要一段时间,这将是计算上昂贵的。一个近似的解决方案对我来说非常好。
我的推理:
在单变量法线中,可以简单地使用累积分布函数(或者甚至将其值存储为标准函数然后进行标准化),但遗憾的是,{m}形式的not to be形式为多变量。
单变量的另一种方法是使用bivariate approximation的倒数(因此,将正态近似为二项式),但将其扩展到多变量我无法弄清楚如何计算协方差。< / p>
我真的希望有人已经实现了这一点,我很快就需要它(完成我的论文)而我找不到任何东西。
答案 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")