multivariate_distributions

This library provides sampling, density, and log-density predicates for multivariate normal and Student’s t distributions, Mahalanobis distance predicates, additive-log-ratio logistic-normal sampling predicates, Dirichlet sampling, density, and log-density predicates, and multinomial sampling, probability mass, and log-probability mass predicates. Batch predicates return samples as lists of row vectors.

API documentation

Open the ../../apis/library_index.html#multivariate-distributions link in a web browser.

Loading

To load all entities in this library, load the loader.lgt file:

| ?- logtalk_load(multivariate_distributions(loader)).

Testing

To test this library predicates, load the tester.lgt file:

| ?- logtalk_load(multivariate_distributions(tester)).

Scope

The multivariate_distributions(Random) parametric object accepts a random source implementing the sampling_protocol protocol. Common choices are random(xoshiro128pp) and fast_random(xoshiro128pp).

Covariance and scale matrices may be singular positive-semidefinite matrices. The predicates use eigendecomposition to operate on their affine support and do not add diagonal jitter. Density predicates return 0.0 outside singular support and log-density predicates return negative_infinity. Mahalanobis distance predicates throw an error for points outside support.

For the multivariate Student’s t distribution, the matrix argument is a scale matrix. When the degrees of freedom are greater than two, the covariance is the scale matrix multiplied by DegreesOfFreedom / (DegreesOfFreedom - 2).

The logistic-normal predicates use the additive log-ratio representation. A latent vector of length d maps to a simplex vector of length d+1, with the last simplex component used as the fixed reference component.

Dirichlet densities support simplex boundary points. Depending on the alpha parameters, boundary density and log-density values may be represented by the atoms positive_infinity and negative_infinity. When zero components have both alphas smaller than one and alphas greater than one, the boundary limit is path-dependent and both predicates return undefined.

Multinomial probability lists must be nonempty and sum to one within a tolerance of 1.0e-12. Multinomial quantiles order count vectors by decreasing probability mass and use increasing lexicographic order to break log-probability ties within a relative tolerance of 1.0e-12.

Multinomial sampling performs one linear category selection and one count-vector update per trial, requiring time proportional to the product of the trial and category counts. Multinomial quantiles enumerate and sort the complete count-vector state space. For Trials trials and Categories categories, this space contains binomial(Trials + Categories - 1, Categories - 1) vectors; the implementation therefore requires combinatorial time and memory and rejects queries exceeding 100000 vectors. Inputs near that limit can still require substantial runtime and memory.

Normal, Student’s t, and logistic-normal sampling requires an eigendecomposition of the covariance or scale matrix. Batch sampling predicates factorize the matrix once and should be preferred when generating multiple samples.

Examples

Generate one multivariate normal sample using a portable pseudo-random source:

| ?- multivariate_distributions(random(xoshiro128pp))::multivariate_normal(
         [0.0, 0.0], [[1.0, 0.5], [0.5, 1.0]], Sample
     ).

Generate a batch of five samples, factorizing the covariance matrix only once:

| ?- multivariate_distributions(random(xoshiro128pp))::multivariate_normal_samples(
         5, [0.0, 0.0], [[1.0, 0.5], [0.5, 1.0]], Samples
     ).

Compute a density and a Mahalanobis distance (these predicates do not consume random values):

| ?- multivariate_distributions(random(xoshiro128pp))::multivariate_normal_density(
         [1.0, 0.0], [0.0, 0.0], [[1.0, 0.0], [0.0, 1.0]], Density
     ).
Density = 0.09653235263005393.

| ?- multivariate_distributions(random(xoshiro128pp))::mahalanobis_distance(
         [2.0, 0.0], [0.0, 0.0], [[4.0, 0.0], [0.0, 1.0]], Distance
     ).
Distance = 1.0.

For a singular covariance matrix, density is evaluated on its affine support and is zero outside it:

| ?- multivariate_distributions(random(xoshiro128pp))::multivariate_normal_density(
         [1.0, 1.0], [0.0, 0.0], [[1.0, 0.0], [0.0, 0.0]], Density
     ).
Density = 0.0.

Generate a multivariate Student’s t sample with five degrees of freedom:

| ?- multivariate_distributions(random(xoshiro128pp))::multivariate_t(
         5.0, [0.0, 0.0], [[1.0, 0.0], [0.0, 1.0]], Sample
     ).

Generate a logistic-normal probability vector. A two-dimensional latent normal distribution produces three simplex components:

| ?- multivariate_distributions(random(xoshiro128pp))::logistic_normal(
         [0.0, 0.0], [[1.0, 0.0], [0.0, 1.0]], Probabilities
     ).