# Analyse¶

## Example¶

A basic example and properties of MultiNorm were shown in Getting started.

from multinorm import MultiNorm
mean = [10, 20, 30]
covariance = [[1, 0, 0], [0, 4, 0], [0, 0, 9]]
names = ["a", "b", "c"]
mn = MultiNorm(mean, covariance, names)


## Scipy¶

For most computations, MultiNorm uses scipy. The MultiNorm.scipy property is a frozen scipy.stats.multivariate_normal object. It is cached, accessing it multiple times doesn’t incur any extra computations. Note that scipy.stats.multivariate_normal has a cov_info object, which contains a covariance matrix decomposition which is computed once and cached. It is at this time undocumented, but it is a public property and is what powers most computations in the scipy and in this class.

>>> s = mn.scipy
>>> type(s)
scipy.stats._multivariate.multivariate_normal_frozen


To present a consistent and complete API, MultiNorm re-exposes the functionality of scipy.stats.multivariate_normal, it is a wrapper.

Draw random samples from the distribution using MultiNorm.sample:

>>> points = mn.sample(size=2, random_state=0)
>>> points
array([[10.97873798, 20.80031442, 35.29215704],
[ 9.02272212, 23.73511598, 36.7226796 ]])


Points are always given as arrays with shape (n_dim, n_points).

Evaluate the probability density function (PDF), call MultiNorm.pdf:

>>> mn.pdf(points)
array([1.27661616e-03, 9.31966590e-05])


For log(pdf) (natural logarithm), call MultiNorm.logpdf:

>>> mn.logpdf(points)
array([-6.66354232, -9.28079868])


There is also a cdf and logcdf method for the cumulative distribution function, as well as entropy. Since these are rarely needed, we didn’t wrap them. But you can still access them via the MultiNorm.scipy property.

TODO: marginal

## Conditional¶

TODO: document MultiNorm.conditional

## Error propagation¶

TODO: document MultiNorm.to_uncertainties

## Sigmas¶

TODO: document MultiNorm.sigma_distance