.. 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_branin_function.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_branin_function.py: Kriging: metamodel of the Branin-Hoo function ============================================== .. GENERATED FROM PYTHON SOURCE LINES 6-9 As a popular use case in optimization we briefly present the construction of a metamodel of the Branin (also referred to as Branin-Hoo) function. .. GENERATED FROM PYTHON SOURCE LINES 11-18 .. code-block:: Python from numpy import sqrt import openturns as ot import openturns.viewer as otv from openturns.usecases import branin_function from matplotlib import pylab as plt .. GENERATED FROM PYTHON SOURCE LINES 19-20 We load the Branin-Hoo model from the usecases module and use the model (stored in `objectiveFunction`) .. GENERATED FROM PYTHON SOURCE LINES 20-23 .. code-block:: Python bm = branin_function.BraninModel() model = bm.objectiveFunction .. GENERATED FROM PYTHON SOURCE LINES 24-26 We shall represent this 2D function with isolines. We set the number of isolines to a maximum of 10 thanks to the following `ResourceMap` key : .. GENERATED FROM PYTHON SOURCE LINES 26-30 .. code-block:: Python ot.ResourceMap.SetAsUnsignedInteger("Contour-DefaultLevelsNumber", 10) graphBasic = model.draw([0.0, 0.0], [1.0, 1.0], [100] * 2) view = otv.View(graphBasic) .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_001.png :alt: y0 as a function of (u1,u2) :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 31-32 We get the values of all isolines : .. GENERATED FROM PYTHON SOURCE LINES 32-46 .. code-block:: Python levels = graphBasic.getDrawables()[0].getLevels() # # %% # # We now build fancy isolines : # # Build a range of colors # ot.ResourceMap.SetAsUnsignedInteger("Drawable-DefaultPalettePhase", len(levels)) # palette = ot.Drawable.BuildDefaultPalette(len(levels)) graphFineTune = ot.Graph("The exact Branin model", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables([graphBasic.getDrawable(0)]) # graphFineTune.setLegendPosition("") # Remove the legend .. GENERATED FROM PYTHON SOURCE LINES 47-48 We also represent the three minima of the Branin function with orange diamonds : .. GENERATED FROM PYTHON SOURCE LINES 48-58 .. code-block:: Python sample1 = ot.Sample([bm.xexact1, bm.xexact2, bm.xexact3]) cloud1 = ot.Cloud(sample1, "orange", "diamond", "First Cloud") graphFineTune.add(cloud1) # Draw the graph with the palette assigned to the contour view = otv.View(graphFineTune) # # The values of the exact model at these points are : print(bm.objectiveFunction(sample1)) .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_002.png :alt: The exact Branin model :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none [ y0 ] 0 : [ -1.04741 ] 1 : [ -1.04741 ] 2 : [ -1.04741 ] .. GENERATED FROM PYTHON SOURCE LINES 59-61 The Branin function has a global minimum attained at three different points. We shall build a metamodel of this function that presents the same behaviour. .. GENERATED FROM PYTHON SOURCE LINES 64-69 Definition of the Kriging metamodel ----------------------------------- We use the :class:`~openturns.KrigingAlgorithm` class to perform the kriging analysis. We first generate a design of experiments with LHS and store the input trainig points in `xdata` .. GENERATED FROM PYTHON SOURCE LINES 69-77 .. code-block:: Python experiment = ot.LHSExperiment( ot.JointDistribution([ot.Uniform(0.0, 1.0), ot.Uniform(0.0, 1.0)]), 28, False, True, ) xdata = experiment.generate() .. GENERATED FROM PYTHON SOURCE LINES 78-79 We also get the output training values : .. GENERATED FROM PYTHON SOURCE LINES 79-82 .. code-block:: Python ydata = bm.objectiveFunction(xdata) .. GENERATED FROM PYTHON SOURCE LINES 83-84 This use case is defined in dimension 2 and we use a constant basis for the trend estimation : .. GENERATED FROM PYTHON SOURCE LINES 84-87 .. code-block:: Python dimension = bm.dim basis = ot.ConstantBasisFactory(dimension).build() .. GENERATED FROM PYTHON SOURCE LINES 88-89 We choose a squared exponential covariance model in dimension 2 : .. GENERATED FROM PYTHON SOURCE LINES 89-91 .. code-block:: Python covarianceModel = ot.SquaredExponential([0.1] * dimension, [1.0]) .. GENERATED FROM PYTHON SOURCE LINES 92-93 We have all the components to build a kriging algorithm and run it : .. GENERATED FROM PYTHON SOURCE LINES 93-96 .. code-block:: Python algo = ot.KrigingAlgorithm(xdata, ydata, covarianceModel, basis) algo.run() .. GENERATED FROM PYTHON SOURCE LINES 97-98 We get the result of the kriging analysis with : .. GENERATED FROM PYTHON SOURCE LINES 98-100 .. code-block:: Python result = algo.getResult() .. GENERATED FROM PYTHON SOURCE LINES 101-105 Metamodel visualization ----------------------- We draw the kriging metamodel of the Branin function. It is the mean of the random process. .. GENERATED FROM PYTHON SOURCE LINES 105-123 .. code-block:: Python metamodel = result.getMetaModel() graphBasic = metamodel.draw([0.0, 0.0], [1.0, 1.0], [100] * 2) # Take the first drawable as the only contour with multiple levels contours = graphBasic.getDrawable(0).getImplementation() contours.setColorBarPosition("") # Hide the color bar contours.setDrawLabels(True) # Draw the labels levels = contours.getLevels() # Build a range of colors ot.ResourceMap.SetAsUnsignedInteger("Drawable-DefaultPalettePhase", len(levels)) palette = ot.Drawable.BuildDefaultPalette(len(levels)) graphFineTune = ot.Graph("Branin metamodel (mean)", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables([contours]) graphFineTune.setLegendPosition("") .. GENERATED FROM PYTHON SOURCE LINES 124-125 We also represent the location of the minima of the Branin function : .. GENERATED FROM PYTHON SOURCE LINES 125-130 .. code-block:: Python sample1 = ot.Sample([bm.xexact1, bm.xexact2, bm.xexact3]) cloud1 = ot.Cloud(sample1, "orange", "diamond", "First Cloud") graphFineTune.add(cloud1) view = otv.View(graphFineTune) .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_003.png :alt: Branin metamodel (mean) :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 131-132 We evaluate the metamodel at the minima locations : .. GENERATED FROM PYTHON SOURCE LINES 132-134 .. code-block:: Python print(metamodel(sample1)) .. rst-class:: sphx-glr-script-out .. code-block:: none 0 : [ -1.06947 ] 1 : [ -1.04058 ] 2 : [ -1.05336 ] .. GENERATED FROM PYTHON SOURCE LINES 135-138 Graphically, both the metamodel and the exact function look the same. The metamodel also has three basins around the minima and the value of the metamodel at each minimum location is comparable to the exact value of -0.979476. We have roughly two correct digits for each isoline. .. GENERATED FROM PYTHON SOURCE LINES 141-146 Standard deviation ------------------ We finally take a look at the standard deviation in the :math:`[0,1] \times [0,1]` domain. It may be seen as a measure of the error of the metamodel. .. GENERATED FROM PYTHON SOURCE LINES 148-149 We discretize the domain with 22 points (N inside points and 2 endpoints) : .. GENERATED FROM PYTHON SOURCE LINES 149-152 .. code-block:: Python N = 20 inputData = ot.Box([N, N]).generate() .. GENERATED FROM PYTHON SOURCE LINES 153-154 We compute the conditional variance of the model and take the square root to get the deviation : .. GENERATED FROM PYTHON SOURCE LINES 154-157 .. code-block:: Python condCov = result.getConditionalMarginalVariance(inputData, 0) condCovSd = sqrt(condCov) .. GENERATED FROM PYTHON SOURCE LINES 158-159 As we have previously done we build contours with the following levels ans labels : .. GENERATED FROM PYTHON SOURCE LINES 159-166 .. code-block:: Python levels = [0.01, 0.025, 0.050, 0.075, 0.1, 0.125, 0.150, 0.175] contour = ot.Contour(N + 2, N + 2, condCovSd) contour.setLevels(levels) graphFineTune = ot.Graph("Standard deviation", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables([contour]) graphFineTune.setLegendPosition("") .. GENERATED FROM PYTHON SOURCE LINES 167-168 We superimpose the training sample : .. GENERATED FROM PYTHON SOURCE LINES 168-174 .. code-block:: Python cloud = ot.Cloud(xdata) cloud.setPointStyle("fcircle") cloud.setColor("red") graphFineTune.add(cloud) view = otv.View(graphFineTune) .. image-sg:: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_004.png :alt: Standard deviation :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 175-178 We observe that the standard deviation is small in the center of the domain where we have enough data to learn the model. We can print the value of the variance at the first 5 training points (they all behave similarly) : .. GENERATED FROM PYTHON SOURCE LINES 178-180 .. code-block:: Python print(result.getConditionalMarginalVariance(xdata, 0)[0:5]) .. rst-class:: sphx-glr-script-out .. code-block:: none [ v0 ] 0 : [ 2.63048e-24 ] 1 : [ 1.00734e-25 ] 2 : [ 1.42109e-14 ] 3 : [ -1.42109e-14 ] 4 : [ -1.42109e-14 ] .. GENERATED FROM PYTHON SOURCE LINES 181-183 These values are nearly zero which is expected as the kriging interpolates data. The value being known it is not random anymore and the variance ought to be zero. .. GENERATED FROM PYTHON SOURCE LINES 185-186 Display all figures .. GENERATED FROM PYTHON SOURCE LINES 186-188 .. code-block:: Python plt.show() .. GENERATED FROM PYTHON SOURCE LINES 189-190 Reset default settings .. GENERATED FROM PYTHON SOURCE LINES 190-191 .. code-block:: Python ot.ResourceMap.Reload() .. _sphx_glr_download_auto_meta_modeling_kriging_metamodel_plot_kriging_branin_function.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_branin_function.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_kriging_branin_function.py `