Note
Go to the end to download the full example code.
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)
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)
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)
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)
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)
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)
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)
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)
We can also build a distribution with the simplified construction
distribution = antecedent.exp()
graph = distribution.drawPDF()
view = viewer.View(graph)
and by using chained operators:
distribution = antecedent.abs().sqrt()
graph = distribution.drawPDF()
view = viewer.View(graph)
Display all figures
plt.show()