Transform a distribution

In this example we are going to use distribution algebra and distribution transformation via functions.

import openturns as ot
import openturns.viewer as viewer
from matplotlib import pylab as plt

ot.Log.Show(ot.Log.NONE)

We define some (classical) distributions :

distribution1 = ot.Uniform(0.0, 1.0)
distribution2 = ot.Uniform(0.0, 2.0)
distribution3 = ot.WeibullMin(1.5, 2.0)

Sum & difference of distributions

It is easy to compute the sum of distributions. For example:

distribution = distribution1 + distribution2
print(distribution)
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation
Trapezoidal(a = 0, b = 1, c = 2, d = 3)

We might also use subtraction even with scalar values:

distribution = 3.0 - distribution3
print(distribution)
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation
RandomMixture(3 - WeibullMin(beta = 1.5, alpha = 2, gamma = 0))

Product & inverse

We might also compute the product of two (or more) distributions. For example:

distribution = distribution1 * distribution2
print(distribution)
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation
ProductDistribution(Uniform(a = 0, b = 1) * Uniform(a = 0, b = 2))

We could also inverse a distribution :

distribution = 1 / distribution1
print(distribution)
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation
CompositeDistribution=f(Uniform(a = 0, b = 1)) with f=[x]->[1.0 / x]

Or compute a ratio distribution :

ratio = distribution2 / distribution1
print(ratio)
graph = ratio.drawPDF()
view = viewer.View(graph)
plot distribution transformation
ProductDistribution(Uniform(a = 0, b = 2) * CompositeDistribution=f(Uniform(a = 0, b = 1)) with f=[x]->[1.0 / x])

Transformation using functions

The library provides methods to get the full distributions of f(x) where f can be equal to:

  • sin,

  • asin,

  • cos,

  • acos,

  • tan,

  • atan,

  • sinh,

  • asinh,

  • cosh,

  • acosh,

  • tanh,

  • atanh,

  • sqr (for square),

  • inverse,

  • sqrt,

  • exp,

  • log/ln,

  • abs,

  • cbrt.

For example for the usual log transformation:

graph = distribution1.log().drawPDF()
view = viewer.View(graph)
plot distribution transformation

And for the log2 function :

f = ot.SymbolicFunction(["x"], ["log2(x)"])
f.setDescription(["X", "ln(X)"])
graph = ot.CompositeDistribution(f, distribution1).drawPDF()
view = viewer.View(graph)
plot distribution transformation

If one wants a specific method, user might rely on the CompositeDistribution class.

# Create a composite distribution
# -------------------------------
#
# In this paragraph we create a distribution defined as the push-forward distribution of a scalar distribution by a transformation.
#
# If we note :math:`\mathcal{L}_0` a scalar distribution, :math:`f: \mathbb{R} \rightarrow \mathbb{R}` a mapping,
# then it is possible to create the push-forward distribution :math:`\mathcal{L}` defined by
#
# .. math::
#    \mathcal{L} = f(\mathcal{L}_0)
#

We create a 1D normal distribution

antecedent = ot.Normal()

and a 1D transform :

f = ot.SymbolicFunction(["x"], ["sin(x)+cos(x)"])

We then create the composite distribution

distribution = ot.CompositeDistribution(f, antecedent)
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation

We can also build a distribution with the simplified construction

distribution = antecedent.exp()
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation

and by using chained operators:

distribution = antecedent.abs().sqrt()
graph = distribution.drawPDF()
view = viewer.View(graph)
plot distribution transformation

Display all figures

plt.show()