Analyse

Example

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

On this page we continue with analysis methods using same example:

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 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 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 pdf():

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

For log(pdf) (natural logarithm), call 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 scipy() property.

Marginal

TODO: marginal

Conditional

TODO: conditional

Error propagation

TODO: to_uncertainties, to_soerp, to_mcerp

Sigmas

TODO: sigma_distance