TransportMaps.jl
This is an implementation of triangular transport maps in Julia based on the description in [1]. For a comprehensive introduction to transport maps, see [2]. The theoretical foundations for monotone triangular transport maps are detailed in [1], [3]. For practical applications in structural health monitoring and Bayesian inference, see [4].
What are Transport Maps?
Transport maps are smooth, invertible functions that can transform one probability distribution into another [1]. The mathematical foundation builds on the Rosenblatt transformation [5] and the Knothe-Rosenblatt rearrangement [6]. They are particularly useful for:
- Sampling: Generate samples from complex distributions by transforming samples from simple distributions
- Variational inference: Approximate complex posterior distributions in Bayesian updating problems [4]
- Density estimation: Learn the structure of complex probability distributions
Key Features
- Polynomial Maps: Triangular polynomial transport maps
- Adaptive Construction: Automatic selection of polynomial terms for efficient approximation
- Multiple Rectifiers: Support for different activation functions (Softplus, ShiftedELU, Identity)
- Quadrature Integration: Multiple quadrature schemes for map optimization
- Optimization: Built-in optimization routines for fitting maps to target densities
Installation
using Pkg
Pkg.add("TransportMaps")
Quick Start Example
Here's a simple example showing how to construct a transport map for a "banana" distribution:
using TransportMaps
using Distributions
# Create a 2D polynomial map with degree 2 and Softplus rectifier
M = PolynomialMap(2, 2, Softplus())
# Set up quadrature for optimization
quadrature = GaussHermiteWeights(3, 2)
# Define target density (banana distribution)
target_density(x) = pdf(Normal(), x[1]) * pdf(Normal(), x[2] - x[1]^2)
# Optimize the map coefficients
result = optimize!(M, target_density, quadrature)
# Generate samples by mapping standard Gaussian samples
samples_z = randn(1000, 2)
mapped_samples = reduce(vcat, [evaluate(M, x)' for x in eachrow(samples_z)])
# Evaluate map quality
variance_diag = variance_diagnostic(M, target_density, samples_z)
Package Architecture
The package is organized around several key components:
Map Components
PolynomialMapComponent
: Individual polynomial components of triangular mapsHermiteBasis
: Hermite polynomial basis functionsMultivariateBasis
: Multivariate polynomial basis construction
Transport Maps
PolynomialMap
: Main triangular polynomial transport map implementation
Rectifier Functions
IdentityRectifier
: No transformation (linear)Softplus
: Smooth positive transformationShiftedELU
: Exponential linear unit variant
Quadrature and Optimization
GaussHermiteWeights
: Gauss-Hermite quadrature points and weightsMonteCarloWeights
: Monte Carlo integrationLatinHypercubeWeights
: Latin hypercube sampling
API Reference
Authors
- Lukas Fritsch, Institute for Risk and Reliability, Leibniz University Hannover
- Jan Grashorn, Chair for Engineering Materials and Building Preservation, Helmut-Schmidt-University Hamburg
Related Implementation
- ATM: Matlab code for adaptive transport maps [3]
- MParT: C++-based library for transport maps [7]
- TransportBasedInference.jl: Julia implementation of adaptive transport maps (ATM) and Kalman filters
- SequentialMeasureTransport.jl: Julia implementation of transport maps from sum-of-squares densities [8]
- Triangular-Transport-Toolbox: Python code for the triangular transport tutorial paper [2]