2017-01-02 11 views
1

したがって、N個の多変量正規分布の集合があり、それらはすべて同じ共分散を持ちます。これらの分布のそれぞれについて、値xを得る可能性を計算したい。Python:N個の多変量正規分布の値の可能性を計算する

単一分布については

、および「X」の値の倍数、これは我々がこれを逆にし、我々は唯一確認する1つの値を持っていると仮定した場合、

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 

これを行う良い方法がありますか?相違がある場合は、共分散行列が無相関であると仮定してもよいが、一般的な解が好ましい。

答えて

1

まず、すべての分布のマハラノビス距離の二乗を計算できます。 https://en.wikipedia.org/wiki/Mahalanobis_distance

その後、確率密度を計算します。あなたが遅いのpythonループを回避することができnumpyの配列を使用することにより

* https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.multivariate_normal.html * https://en.wikipedia.org/wiki/Multivariate_normal_distribution

。 これをあなたの例に追加しました:

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 
+0

ごめんなさい!素晴らしい答え! – Dammi

関連する問題