class

CumulativeDistributionTransform

extendsTransform
CumulativeDistributionTransform(distribution: Distribution)
source

Probability-integral transform y=F(x)y = F(x) via a base distribution's CDF.

Pushes any continuous random variable through its own CDF to obtain a Uniform(0,1)\mathrm{Uniform}(0, 1) random variable — the classical probability integral transform of Smirnov. Useful as a copula building block, for goodness-of-fit testing, and for stitching together heterogeneous flows. event_dim = 0.

Parameters

distributionDistribution
Continuous distribution whose Distribution.cdf and Distribution.icdf define the transform. Both methods must be implemented and the distribution must be continuous (i.e., have a density) for the transform to be a true bijection.

Notes

Forward (CDF):

y=F(x)y = F(x)

Inverse (quantile / ICDF):

x=F1(y)x = F^{-1}(y)

Log Jacobian determinant equals the log-density of the base distribution at xx:

log ⁣F(x)x=logp(x)\log\!\left|\frac{\partial F(x)}{\partial x}\right| = \log p(x)

By the probability-integral transform, if XpX \sim p then F(X)Uniform(0,1)F(X) \sim \mathrm{Uniform}(0, 1). Conversely, if UUniform(0,1)U \sim \mathrm{Uniform}(0, 1) then F1(U)pF^{-1}(U) \sim p, which is the inverse-CDF sampling identity used throughout Lucid's Distribution.rsample implementations.

Examples

>>> import lucid
>>> from lucid.distributions import Normal
>>> from lucid.distributions.transforms import CumulativeDistributionTransform
>>> T = CumulativeDistributionTransform(Normal(loc=0.0, scale=1.0))
>>> T(lucid.tensor(0.0))  # F(0) = 0.5
Tensor(0.5)

Methods (2)

dunder

__init__

None
__init__(distribution: Distribution)
source

Store the distribution whose CDF/ICDF pair defines the transform.

fn

log_abs_det_jacobian

Tensor
log_abs_det_jacobian(x: Tensor, y: Tensor)
source

logF(x)=logp(x)\log|F'(x)| = \log p(x) — the base distribution's log-density at x.