Zrobiłem jeden dla moich celów, więc jakbym podzielają. Jest zbudowany przy użyciu "uprawnień" numpy, na wzorze nie-zdegenerowanego przypadku od http://en.wikipedia.org/wiki/Multivariate_normal_distribution i aso sprawdza dane wejściowe.
Oto kod wraz z przebiegu próbki
from numpy import *
import math
# covariance matrix
sigma = matrix([[2.3, 0, 0, 0],
[0, 1.5, 0, 0],
[0, 0, 1.7, 0],
[0, 0, 0, 2]
])
# mean vector
mu = array([2,3,8,10])
# input
x = array([2.1,3.5,8, 9.5])
def norm_pdf_multivariate(x, mu, sigma):
size = len(x)
if size == len(mu) and (size, size) == sigma.shape:
det = linalg.det(sigma)
if det == 0:
raise NameError("The covariance matrix can't be singular")
norm_const = 1.0/ (math.pow((2*pi),float(size)/2) * math.pow(det,1.0/2))
x_mu = matrix(x - mu)
inv = sigma.I
result = math.pow(math.e, -0.5 * (x_mu * inv * x_mu.T))
return norm_const * result
else:
raise NameError("The dimensions of the input don't match")
print norm_pdf_multivariate(x, mu, sigma)
@pyCthon: Ups. nie zwracał uwagi. –
@pyCthon Tak, wiem, że moja macierz kowariancji jest pozytywnie określona ze sposobu, w jaki została skonstruowana. – Benno
@Benno, rozważ proszę moją odpowiedź, 'multivariate_normal' jest teraz zaimplementowane w' SciPy'. – juliohm