import numpy as np
import sys
import chippr
from chippr import utils as u
[docs]class mvn(object):
def __init__(self, mean, var):
"""
A multivariate Gaussian probability distribution object
Parameters
----------
mean: numpy.ndarray, float
mean of multivariate Gaussian probability distribution
var: numpy.ndarray, float
covariance matrix of multivariate Gaussian probability distribution
"""
self.mean = mean
self.dim = len(self.mean)
self.var = var
self.sigma = self.norm_var()
self.invvar = self.invert_var()
assert np.linalg.eig(self.var) > 0.
[docs] def norm_var(self):
"""
Function to normalize covariance matrix
"""
return np.linalg.det(self.var)
[docs] def invert_var(self):
"""
Function to invert covariance matrix
"""
return np.linalg.inv(self.var)
[docs] def evaluate_one(self, x):
"""
Function to evaluate multivariate Gaussian probability distribution once
Parameters
----------
x: numpy.ndarray, float
value at which to evaluate multivariate Gaussian probability distribution
Returns
-------
p: float
probability associated with x
"""
p = max(u.eps, 1. / (np.sqrt(2. * np.pi) * self.sigma) * \
np.exp(-0.5 * (x - self.mean) * self.invvar * (x - self.mean)))
return p
[docs] def evaluate(self, xs):
"""
Function to evaluate multivariate Gaussian probability distribution at multiple points
Parameters
----------
xs: ndarray, float
input vectors at which to evaluate probability
Returns
-------
ps: ndarray, float
output probabilities
"""
ps = np.zeros(len(xs))
for n, x in enumerate(xs):
ps[n] += self.evaluate_one(x)
return ps
[docs] def sample_one(self):
"""
Function to take one sample from multivariate Gaussian probability distribution
Returns
-------
x: numpy.ndarray, float
single sample from multivariate Gaussian probability distribution
"""
x = self.mean + self.var * np.array([np.random.normal() for k in range(self.dim)])
return x
[docs] def sample(self, n_samps):
"""
Function to sample from multivariate Gaussian probability distribution
Parameters
----------
n_samps: positive int
number of samples to take
Returns
-------
xs: ndarray, float
array of n_samps samples from multivariate Gaussian probability distribution
"""
xs = np.array([self.sample_one() for n in range(n_samps)])
return xs