Source code for mvn

# Wrapper for pomegranate.distributions.MultivariateGaussianDistribution

import sys

import numpy as np

from pomegranate.distributions import MultivariateGaussianDistribution as MGD

import chippr
from chippr import defaults as d
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. self.dist = MGD(self.mean, self.var)
[docs] def norm_var(self): """ Function to normalize covariance matrix Returns ------- det: float determinant of variance """ det = np.linalg.det(self.var) return det
[docs] def invert_var(self): """ Function to invert covariance matrix Returns ------- inv: numpy.ndarray, float inverse variance """ inv = np.linalg.inv(self.var) return inv
[docs] def pdf(self, points): return self.evaluate(points)
[docs] def evaluate_one(self, z): """ Function to evaluate multivariate Gaussian probability distribution once Parameters ---------- z: numpy.ndarray, float value at which to evaluate multivariate Gaussian probability distribution Returns ------- p: float probability associated with z """ # norm_z = z - self.mean # p = max(d.eps, 1. / (np.sqrt(2. * np.pi) * self.sigma) * \ # np.exp(-0.5 * np.dot(np.dot(norm_z, self.invvar), norm_z))) p = self.dist.probability(z) return p
[docs] def evaluate(self, zs): """ Function to evaluate multivariate Gaussian probability distribution at multiple points Parameters ---------- zs: ndarray, float input vectors at which to evaluate probability Returns ------- ps: ndarray, float output probabilities """ # ps = np.zeros(len(zs)) # for n, z in enumerate(zs): # ps[n] += self.evaluate_one(z) ps = self.dist.probability(zs) return ps
[docs] def sample_one(self): """ Function to take one sample from multivariate Gaussian probability distribution Returns ------- z: numpy.ndarray, float single sample from multivariate Gaussian probability distribution """ # z = np.random.multivariate_normal(self.mean, self.var, 1)[0]#self.mean + np.dot(self.var, np.random.normal(size = self.dim)) z = self.dist.sample(1) return z
[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 ------- zs: ndarray, float array of n_samps samples from multivariate Gaussian probability distribution """ # print('mvn trying to sample '+str(n_samps)+' from '+str(self.dist)) # zs = np.array([self.sample_one() for n in range(n_samps)]) zs = np.array(self.dist.sample(n_samps)) # print('mvn sampled '+str(n_samps)+' from '+str(self.dist)) return zs