def logpdf(X, Mu, Sigma):
"""Multivariate normal log pdf."""
# This is the multivariate normal log pdf for an array X of n
# outputs, an array Mu of n means, and an n-by-n positive-definite
# covariance matrix Sigma. The direct-space density is:
#
# P(X | Mu, Sigma)
# = ((2 pi)^n det Sigma)^(-1/2)
# exp((-1/2) (X - Mu)^T Sigma^-1 (X - Mu)),
#
# We want this in log-space, so we have
#
# log P(X | Mu, Sigma)
# = (-1/2) (X - Mu)^T Sigma^-1 (X - Mu) - log ((2 pi)^n det Sigma)^(1/2)
# = (-1/2) (X - Mu)^T Sigma^-1 (X - Mu)
# - (n/2) log (2 pi) - (1/2) log det Sigma.
#
n = len(X)
assert X.shape == (n,)
assert Mu.shape == (n,)
assert Sigma.shape == (n, n)
assert np.all(np.isfinite(X))
assert np.all(np.isfinite(Mu))
assert np.all(np.isfinite(Sigma))
X_ = X - Mu
covf = _covariance_factor(Sigma)
logp = -np.dot(X_.T, covf.solve(X_)/2.)
logp -= (n/2.)*np.log(2*np.pi)
logp -= covf.logsqrtdet()
# Convert 1x1 matrix to float.
return float(logp)
评论列表
文章目录