eulerpi.core.transformations module

This module implements the random variable transformation of the EPI algorithm.

calc_gram_determinant(jac: Array) float64[source]

Evaluate the pseudo-determinant of the jacobian

\[\sqrt{\det \left({\frac{ds}{dq}(q)}^\intercal {\frac{ds}{dq}(q)}\right)}\]

Warning

The pseudo-determinant of the model jacobian serves as a correction term in the evaluate_density function. Therefore this function returns 0 if the result is not finite.

Parameters:

jac (jnp.ndarray) – The jacobian for which the pseudo determinant shall be calculated

Returns:

The pseudo-determinant of the jacobian. Returns 0 if the result is not finite.

Return type:

jnp.double

Examples:

import jax.numpy as jnp
from eulerpi.core.transformations import calc_gram_determinant

jac = jnp.array([[1,2], [3,4], [5,6], [7,8]])
pseudo_det = calc_gram_determinant(jac)
eval_log_transformed_density(param: ndarray, model: BaseModel, data: ndarray, data_transformation: DataTransformation, data_stdevs: ndarray, slice: ndarray) Tuple[float64, ndarray][source]

Calculate the logarithmical parameter density as backtransformed data density using the simulation model

\[\begin{split}\log{\Phi_\mathcal{Q}(q)} := \begin{cases} \log{\Phi_\mathcal{Q}(q)} \quad \text{if } \Phi_\mathcal{Q}(q) > 0 \\ -\infty \quad \text{else} \end{cases}\end{split}\]
Parameters:
  • param (np.ndarray) – parameter for which the transformed density shall be evaluated

  • model (BaseModel) – model to be evaluated

  • data (np.ndarray) – data for the model. 2D array with shape (#num_data_points, #data_dim)

  • data_transformation (DataTransformation) – The data transformation used to normalize the data.

  • data_stdevs (np.ndarray) – array of suitable kernel width for each data dimension

  • slice (np.ndarray) – slice of the parameter vector that is to be evaluated

Returns:

: natural log of the parameter density at the point param : sampler_results (array concatenation of parameters, simulation results and evaluated density, stored as “blob” by the emcee sampler)

Return type:

Tuple[np.double, np.ndarray]

evaluate_density(param: ndarray, model: BaseModel, data: ndarray, data_transformation: DataTransformation, data_stdevs: ndarray, slice: ndarray) Tuple[float64, ndarray][source]

Calculate the parameter density as backtransformed data density using the simulation model

\[\Phi_\mathcal{Q}(q) = \Phi_\mathcal{Y}(s(q)) \cdot \sqrt{\det \left({\frac{ds}{dq}(q)}^\intercal {\frac{ds}{dq}(q)}\right)}\]
Parameters:
  • param (np.ndarray) – parameter for which the transformed density shall be evaluated

  • model (BaseModel) – model to be evaluated

  • data (np.ndarray) – data for the model. 2D array with shape (#num_data_points, #data_dim)

  • data_transformation (DataTransformation) – The data transformation used to normalize the data.

  • data_stdevs (np.ndarray) – array of suitable kernel width for each data dimension

  • slice (np.ndarray) – slice of the parameter vector that is to be evaluated

Returns:

: parameter density at the point param : vector containing the parameter, the simulation result and the density

Return type:

Tuple[np.double, np.ndarray]

Examples:

import numpy as np
from eulerpi.examples.heat import Heat
from eulerpi.core.kde import calc_kernel_width
from eulerpi.core.data_transformations import DataIdentity
from eulerpi.core.transformations import evaluate_density

# use the heat model
model = Heat()

# generate 1000 artificial, 5D data points for the Heat example model
data_mean = np.array([0.5, 0.1, 0.5, 0.9, 0.5])
data = np.random.randn(1000, 5)/25.0 + data_mean

# evaluating the parameter probabiltiy density at the central parameter of the Heat model
eval_param = model.central_param

# calculating the kernel widths for the data based on Silverman's rule of thumb
data_stdevs = calc_kernel_width(data)

# evaluate the three-variate joint density
slice = np.array([0,1,2])

(central_param_density, all_res) = evaluate_density(param = eval_param,
                                                    model = model,
                                                    data = data,
                                                    data_transformation = DataIdentity(), # no data transformatio,
                                                    data_stdevs = data_stdevs,
                                                    slice = slice)

# all_res is the concatenation of the evaluated parameter, the simulation result arising from that parameter and the inferred paramter density. Decompose as follows:
eval_param = all_res[0:model.param_dim]
sim_result = all_res[model.param_dim:model.param_dim+model.data_dim]
central_param_density = all_res[-1]