Python:计算N个多元正态分布值的可能性

Python:计算N个多元正态分布值的可能性,python,performance,scipy,normal-distribution,Python,Performance,Scipy,Normal Distribution,我有一组N个多元正态分布,它们都有相同的协方差。对于这些分布中的每一个,我想计算得到x值的可能性 对于单个分布和多个“x”值,这是微不足道的 from scipy.stats import multivariate_normal import numpy as np cov = [[1 ,0.1],[0.1 ,1]] mean = [0,0] Values = np.random.multivariate_normal([0,0],cov,samp) print multivariate_n

我有一组N个多元正态分布,它们都有相同的协方差。对于这些分布中的每一个,我想计算得到x值的可能性

对于单个分布和多个“x”值,这是微不足道的

from scipy.stats import multivariate_normal
import numpy as np

cov = [[1 ,0.1],[0.1 ,1]]
mean = [0,0]
Values = np.random.multivariate_normal([0,0],cov,samp)
print  multivariate_normal.pdf(Values, mean, cov)
现在,如果我们把它颠倒过来,假设我们只需要检查一个值,但每次都有多个均值,但协方差相同。如下所示(当然,在实际情况中,每次迭代的平均值是不同的)


有更好的方法吗?如果存在任何差异,则假设协方差矩阵不相关也是允许的,尽管一般解决方案更可取。

您可以首先计算所有分布的平方马氏距离。

然后计算概率密度

* *

通过使用numpy数组,可以避免缓慢的python循环。 我在您的示例中添加了以下内容:

from scipy.stats import multivariate_normal
import numpy as np

cov = [[1 ,0.5],[0.5 ,1]]
mean = [2,2]

samples = 10
means = [mean]*samples

Value = (3,2.5)

L = []
for iMean in means:
    L.append(multivariate_normal.pdf(Value, iMean, cov))



mean_array = np.array(means)
value_array = np.array(Value).astype(np.float)
cov_array = np.array(cov)
inv_cov_array = np.linalg.inv(cov_array)
dim = cov_array.shape[0]

diffs = value_array-mean_array
maha_distances = np.sum(diffs.transpose()*np.dot(inv_cov_array,diffs.transpose()),axis=0)    
denominator = 1/np.sqrt((2*np.pi)**dim*np.linalg.det(cov_array))

l = denominator * np.exp(-0.5*maha_distances)

res_dif = np.array(L) - l
print res_dif
from scipy.stats import multivariate_normal
import numpy as np

cov = [[1 ,0.5],[0.5 ,1]]
mean = [2,2]

samples = 10
means = [mean]*samples

Value = (3,2.5)

L = []
for iMean in means:
    L.append(multivariate_normal.pdf(Value, iMean, cov))



mean_array = np.array(means)
value_array = np.array(Value).astype(np.float)
cov_array = np.array(cov)
inv_cov_array = np.linalg.inv(cov_array)
dim = cov_array.shape[0]

diffs = value_array-mean_array
maha_distances = np.sum(diffs.transpose()*np.dot(inv_cov_array,diffs.transpose()),axis=0)    
denominator = 1/np.sqrt((2*np.pi)**dim*np.linalg.det(cov_array))

l = denominator * np.exp(-0.5*maha_distances)

res_dif = np.array(L) - l
print res_dif