Python:计算N个多元正态分布值的可能性
问题描述:
所以我有一组N个多元正态分布,它们都具有相同的协方差。对于这些分布中的每一个,我想计算得到值x的可能性。Python:计算N个多元正态分布值的可能性
对于单个分布情况,以及“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)
,如果我们扭转这一点,假设我们只有一个值来检查,但多个手段,每次都有相同的协方差。如下(当然在实际情况下,每次迭代的平均值不同)
means = [mean]*samples
Value = Values[0,:]
L = []
for iMean in means:
L.append(multivariate_normal.pdf(Value, iMean, cov))
print L
有没有更好的方法来做到这一点?如果存在任何差异,那么假设协方差矩阵不相关也是允许的,尽管通常的解决方案是优选的。
答
您可以先计算所有分布的平方马氏距离。 https://en.wikipedia.org/wiki/Mahalanobis_distance
然后你计算概率密度。
* https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.multivariate_normal.html * https://en.wikipedia.org/wiki/Multivariate_normal_distribution
使用numpy的阵列可以避开缓慢蟒蛇循环。 我将此添加到您的示例中:
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
对不起,迟到接受!很好的答案! – Dammi