.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_meta_modeling/kriging_metamodel/plot_kriging_multioutput_firesatellite.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_meta_modeling_kriging_metamodel_plot_kriging_multioutput_firesatellite.py: Example of multi output Gaussian Process Regression on the fire satellite model =============================================================================== .. GENERATED FROM PYTHON SOURCE LINES 7-8 This example aims to illustrate Gaussian Process Fitter (Kriging) metamodel with several outputs on the fire satellite model. .. GENERATED FROM PYTHON SOURCE LINES 11-15 Loading of the model -------------------- This model involves 9 input variables and 3 output variables. We load the :ref:`Fire satellite use case`. .. GENERATED FROM PYTHON SOURCE LINES 17-25 .. code-block:: Python import openturns as ot from openturns.usecases.fire_satellite import FireSatelliteModel from openturns.viewer import View import openturns.experimental as otexp m = FireSatelliteModel() .. GENERATED FROM PYTHON SOURCE LINES 26-27 We define the function that evaluates the outputs depending on the inputs. .. GENERATED FROM PYTHON SOURCE LINES 29-31 .. code-block:: Python model = m.model .. GENERATED FROM PYTHON SOURCE LINES 32-33 We also define the distribution of input variables to build the training and test sets. .. GENERATED FROM PYTHON SOURCE LINES 35-38 .. code-block:: Python inputDistribution = m.inputDistribution .. GENERATED FROM PYTHON SOURCE LINES 39-42 Generation of data ------------------ We now generate the input and output training sets as 10 times the dimension of the input vector. .. GENERATED FROM PYTHON SOURCE LINES 44-51 .. code-block:: Python experiment = ot.LHSExperiment(inputDistribution, 10 * m.dim) inputTrainingSet = experiment.generate() outputTrainingSet = model(inputTrainingSet) print("Lower and upper bounds of inputTrainingSet:") print(inputTrainingSet.getMin(), inputTrainingSet.getMax()) .. rst-class:: sphx-glr-script-out .. code-block:: none Lower and upper bounds of inputTrainingSet: [1.51682e+07,887.129,1348.53,12.4228,1.00107,0.269929,2.60879,0.972964,0.274082] [2.04071e+07,1122.44,1445.97,17.4763,3.19127,0.750975,7.3782,3.01005,1.69896] .. GENERATED FROM PYTHON SOURCE LINES 52-55 Creation of metamodel --------------------- We choose to use a constant trend. .. GENERATED FROM PYTHON SOURCE LINES 57-65 .. code-block:: Python linear_basis = ot.LinearBasisFactory(m.dim).build() basis = ot.Basis( [ ot.AggregatedFunction([linear_basis.build(k)] * 3) for k in range(linear_basis.getSize()) ] ) .. GENERATED FROM PYTHON SOURCE LINES 66-69 We would like to have separate covariance models for the three outputs. To do so, we use the :class:`~openturns.TensorizedCovarianceModel`. For the purpose of illustration, we consider :class:`~openturns.MaternModel` for the first and third outputs, and :class:`~openturns.SquaredExponential` for the second output. .. GENERATED FROM PYTHON SOURCE LINES 71-77 .. code-block:: Python myCov1 = ot.MaternModel([1.0] * m.dim, 2.5) myCov2 = ot.SquaredExponential([1.0] * m.dim) myCov3 = ot.MaternModel([1.0] * m.dim, 2.5) covarianceModel = ot.TensorizedCovarianceModel([myCov1, myCov2, myCov3]) .. GENERATED FROM PYTHON SOURCE LINES 78-83 The scaling of the data is really important when dealing with GP fitter, especially considering the domain definition of the input variables (the altitude varies in order of :math:`10^7` whereas the drag coefficient is around 1). We thus define appropriate bounds for the training algorithm based on the domain definition of each variable. .. GENERATED FROM PYTHON SOURCE LINES 85-90 .. code-block:: Python scaleOptimizationBounds = ot.Interval( [1.0e6, 1.0e3, 1.0e3, 1.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], [2.0e7, 2.0e3, 2.0e3, 1e2, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0], ) .. GENERATED FROM PYTHON SOURCE LINES 91-93 We can now define the scaled version of with GP fitter model. First, we need to initialize the covariance model's parameters in accordance with the optimization bounds. .. GENERATED FROM PYTHON SOURCE LINES 93-108 .. code-block:: Python covarianceModelParameters = ( 0.5 * ( scaleOptimizationBounds.getUpperBound() - scaleOptimizationBounds.getLowerBound() ) + scaleOptimizationBounds.getLowerBound() ) covarianceModel.setParameter(covarianceModelParameters) fitter_algo = otexp.GaussianProcessFitter( inputTrainingSet, outputTrainingSet, covarianceModel, basis ) fitter_algo.setOptimizationBounds(scaleOptimizationBounds) fitter_algo.setOptimizeParameters(True) .. GENERATED FROM PYTHON SOURCE LINES 109-110 We run the algorithm and get the metamodel. .. GENERATED FROM PYTHON SOURCE LINES 110-118 .. code-block:: Python fitter_algo.run() fitter_result = fitter_algo.getResult() gpr_algo = otexp.GaussianProcessRegression(fitter_result) gpr_algo.run() gpr_result = gpr_algo.getResult() gprMetamodel = gpr_result.getMetaModel() .. GENERATED FROM PYTHON SOURCE LINES 119-122 Validation of metamodel ----------------------- To validate the metamodel, we create a validation set of size equal to 50 times the input vector dimension to evaluate the functions. .. GENERATED FROM PYTHON SOURCE LINES 124-129 .. code-block:: Python ot.RandomGenerator.SetSeed(1) experimentTest = ot.LHSExperiment(inputDistribution, 50 * m.dim) inputTestSet = experimentTest.generate() outputTestSet = model(inputTestSet) .. GENERATED FROM PYTHON SOURCE LINES 130-131 Then, we use the :class:`~openturns.MetaModelValidation` class to validate the metamodel. .. GENERATED FROM PYTHON SOURCE LINES 131-147 .. code-block:: Python metamodelPredictions = gprMetamodel(inputTestSet) val = ot.MetaModelValidation(outputTestSet, metamodelPredictions) r2Score = val.computeR2Score() label = ["Total torque", "Total power", "Solar array area"] for i in range(3): graph = val.drawValidation().getGraph(0, i) graph.setLegends([""]) graph.setLegends(["R2 = %.2f%%" % (100 * r2Score[i]), ""]) graph.setLegendPosition("upper left") graph.setXTitle("Exact function") graph.setYTitle("Metamodel prediction") graph.setTitle(label[i]) View(graph) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_001.svg :alt: Total torque :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_001.svg :class: sphx-glr-multi-img * .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_002.svg :alt: Total power :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_002.svg :class: sphx-glr-multi-img * .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_003.svg :alt: Solar array area :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_multioutput_firesatellite_003.svg :class: sphx-glr-multi-img .. _sphx_glr_download_auto_meta_modeling_kriging_metamodel_plot_kriging_multioutput_firesatellite.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_kriging_multioutput_firesatellite.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_kriging_multioutput_firesatellite.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_kriging_multioutput_firesatellite.zip `