Introduction to Uncertainty Quantification and Management#

Operate in an uncertain world#

Uncertainty Quantification and Management (UQ&M) is a field of engineering on the rise where several questions arise for the user:

  • uncertainty quantification: how to represent the sources of uncertainties, whether by expert opinion or via data?

  • uncertainty propagation: how to propagate these uncertainties through a model or a system of coupled models?

  • uncertainty quantification (again!): how to represent the resulting uncertainty about the output quantity of interest?

  • sensitivity analysis: how to explain this output uncertainty from the input ones? Are there non-influential sources? Can the others be ordered?

  • reliability: what is the probability that the quantity of interest exceeds a threshold? Conversely, what is the guaranteed threshold for a given confidence level?

  • robust optimization: what would be a good design solution in terms of performance (or cost) and constraints satisfaction, in an uncertain world? Rather than looking for the best solution in the worst case scenario, which would lead to a very conservative solution, why not relax the constraints by guaranteeing them in 99% of cases while maximizing an average performance (or minimizing an average cost)?

GEMSEO implements several UQ&M key concepts through a dedicated package. Moreover, its class ParameterSpace extends the notion of DesignSpace by defining both deterministic and uncertain variables. It can already be used in a DOEScenario to sample a multidisciplinary system. Moreover, the GEMSEO community is currently working on extending its use to any kind of BaseScenario for robust MDO purposes (see Roadmap) by means of dedicated MDO formulations.

The package uncertainty#

Uncertainty quantification and management.

The package uncertainty provides several functionalities to quantify and manage uncertainties. Most of them can be used from the high-level functions provided by this module.

The sub-package distributions offers an abstract level for probability distributions, as well as interfaces to the OpenTURNS and SciPy ones. It is also possible to fit a probability distribution from data or select the most likely one from a list of candidates. These distributions can be used to define random variables in a ParameterSpace before propagating these uncertainties through a system of Discipline, by means of a DOEScenario.

The sub-package sensitivity offers an abstract level for sensitivity analysis, as well as concrete features. These sensitivity analyses compute indices by means of various methods: correlation measures, Morris technique and Sobol' variance decomposition. This sub-package is based in particular on OpenTURNS.

The sub-package statistics offers an abstract level for statistics, as well as parametric and empirical versions. Empirical statistics are estimated from a Dataset while parametric statistics are analytical properties of a BaseDistribution fitted from a Dataset.

create_distribution(distribution_name, **options)[source]

Create a distribution.

Parameters:
  • distribution_name (str) -- The name of a class implementing a probability distribution, e.g. 'OTUniformDistribution' or 'SPDistribution'.

  • **options -- The distribution options.

Return type:

BaseDistribution

Examples

>>> from gemseo.uncertainty import create_distribution
>>>
>>> distribution = create_distribution("OTNormalDistribution", mu=1, sigma=2)
>>> print(distribution)
Normal(mu=1, sigma=2)
>>> print(distribution.mean, distribution.standard_deviation)
1.0 2.0
>>> samples = distribution.compute_samples(10)
>>> print(samples.shape)
(10,)
create_sensitivity_analysis(analysis, samples='')[source]

Create the sensitivity analysis.

Parameters:
  • analysis (str) -- The name of a sensitivity analysis class.

  • samples (IODataset | str | Path) --

    The samples for the estimation of the sensitivity indices, either as an IODataset or as a pickle file path generated from the IODataset.to_pickle method. If empty, use compute_samples().

    By default it is set to "".

Returns:

The sensitivity analysis.

Return type:

BaseSensitivityAnalysis

create_statistics(dataset, variable_names=(), tested_distributions=(), fitting_criterion='BIC', selection_criterion='best', level=0.05, name='')[source]

Create a statistics toolbox, either parametric or empirical.

If parametric, the toolbox selects a distribution from candidates, based on a fitting criterion and on a selection strategy.

Parameters:
  • dataset (Dataset) -- A dataset.

  • variable_names (Iterable[str]) --

    The variables of interest. If empty, consider all the variables from dataset.

    By default it is set to ().

  • tested_distributions (Sequence[str]) --

    The names of the tested distributions.

    By default it is set to ().

  • fitting_criterion (str) --

    The name of a goodness-of-fit criterion, measuring how the distribution fits the data. Use ParametricStatistics.get_criteria() to get the available criteria.

    By default it is set to "BIC".

  • selection_criterion (str) --

    The name of a selection criterion to select a distribution from candidates. Either 'first' or 'best'.

    By default it is set to "best".

  • level (float) --

    A test level, i.e. the risk of committing a Type 1 error, that is an incorrect rejection of a true null hypothesis, for criteria based on a test hypothesis.

    By default it is set to 0.05.

  • name (str) --

    A name for the statistics toolbox instance. If empty, use the concatenation of class and dataset names.

    By default it is set to "".

Returns:

A statistics toolbox.

Return type:

BaseStatistics

Examples

>>> from gemseo import (
...     create_discipline,
...     create_parameter_space,
...     create_scenario,
... )
>>> from gemseo.uncertainty import create_statistics
>>>
>>> expressions = {"y1": "x1+2*x2", "y2": "x1-3*x2"}
>>> discipline = create_discipline(
...     "AnalyticDiscipline", expressions=expressions
... )
>>>
>>> parameter_space = create_parameter_space()
>>> parameter_space.add_random_variable(
...     "x1", "OTUniformDistribution", minimum=-1, maximum=1
... )
>>> parameter_space.add_random_variable(
...     "x2", "OTNormalDistribution", mu=0.5, sigma=2
... )
>>>
>>> scenario = create_scenario(
...     [discipline],
...     "y1",
...     parameter_space,
...     formulation_name="DisciplinaryOpt",
...     scenario_type="DOE",
... )
>>> scenario.execute(algo_name="OT_MONTE_CARLO", n_samples=100)
>>>
>>> dataset = scenario.to_dataset(opt_naming=False)
>>>
>>> statistics = create_statistics(dataset)
>>> mean = statistics.compute_mean()
get_available_distributions(base_class_name='BaseDistribution')[source]

Get the available probability distributions.

Parameters:

base_class_name (str) --

The name of the base class of the probability distributions, e.g. "BaseDistribution", "OTDistribution" or "SPDistribution".

By default it is set to "BaseDistribution".

Returns:

The names of the available probability distributions.

Return type:

list[str]

get_available_sensitivity_analyses()[source]

Get the available sensitivity analyses.

Return type:

list[str]

load_sensitivity_analysis(file_path)[source]

Load a sensitivity analysis from the disk.

Parameters:

file_path (str | Path) -- The path to the file.

Returns:

The sensitivity analysis.

Return type:

BaseSensitivityAnalysis