.. 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) .. GENERATED FROM PYTHON SOURCE LINES 31-32 We get the values of all isolines : .. GENERATED FROM PYTHON SOURCE LINES 32-37 .. code-block:: Python drawables = graphBasic.getDrawables() levels = [] for contours in drawables: levels.append(contours.getLevels()[0]) .. GENERATED FROM PYTHON SOURCE LINES 38-39 We now build fancy isolines : .. GENERATED FROM PYTHON SOURCE LINES 39-60 .. code-block:: Python # Take the first contour as the only one with multiple levels contour = graphBasic.getDrawable(0) # Build a range of colors ot.ResourceMap.SetAsUnsignedInteger("Drawable-DefaultPalettePhase", len(levels)) palette = ot.Drawable.BuildDefaultPalette(len(levels)) # Create the drawables list, appending each contour with its own color drawables = list() for i in range(len(levels)): contour.setLevels([levels[i]]) # Inline the level values contour.setDrawLabels(True) # We have to copy the drawable because a Python list stores only pointers drawables.append(ot.Drawable(contour)) graphFineTune = ot.Graph("The exact Branin model", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables(drawables) # Replace the drawables graphFineTune.setLegendPosition("") # Remove the legend graphFineTune.setColors(palette) # Add colors .. GENERATED FROM PYTHON SOURCE LINES 61-62 We also represent the three minima of the Branin function with orange diamonds : .. GENERATED FROM PYTHON SOURCE LINES 62-71 .. 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) # # 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_001.png :alt: The exact Branin model :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_001.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 72-74 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 77-82 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 82-90 .. code-block:: Python experiment = ot.LHSExperiment( ot.ComposedDistribution([ot.Uniform(0.0, 1.0), ot.Uniform(0.0, 1.0)]), 28, False, True, ) xdata = experiment.generate() .. GENERATED FROM PYTHON SOURCE LINES 91-92 We also get the output training values : .. GENERATED FROM PYTHON SOURCE LINES 92-95 .. code-block:: Python ydata = bm.objectiveFunction(xdata) .. GENERATED FROM PYTHON SOURCE LINES 96-97 This use case is defined in dimension 2 and we use a constant basis for the trend estimation : .. GENERATED FROM PYTHON SOURCE LINES 97-100 .. code-block:: Python dimension = bm.dim basis = ot.ConstantBasisFactory(dimension).build() .. GENERATED FROM PYTHON SOURCE LINES 101-102 We choose a squared exponential covariance model in dimension 2 : .. GENERATED FROM PYTHON SOURCE LINES 102-104 .. code-block:: Python covarianceModel = ot.SquaredExponential([0.1] * dimension, [1.0]) .. GENERATED FROM PYTHON SOURCE LINES 105-106 We have all the components to build a kriging algorithm and run it : .. GENERATED FROM PYTHON SOURCE LINES 106-109 .. code-block:: Python algo = ot.KrigingAlgorithm(xdata, ydata, covarianceModel, basis) algo.run() .. GENERATED FROM PYTHON SOURCE LINES 110-111 We get the result of the kriging analysis with : .. GENERATED FROM PYTHON SOURCE LINES 111-113 .. code-block:: Python result = algo.getResult() .. GENERATED FROM PYTHON SOURCE LINES 114-118 Metamodel visualization ----------------------- We draw the kriging metamodel of the Branin function. It is the mean of the random process. .. GENERATED FROM PYTHON SOURCE LINES 118-147 .. code-block:: Python metamodel = result.getMetaModel() graphBasic = metamodel.draw([0.0, 0.0], [1.0, 1.0], [100] * 2) drawables = graphBasic.getDrawables() levels = [] for i in range(len(drawables)): contours = drawables[i] levels.append(contours.getLevels()[0]) # Take the first contour as the only one with multiple levels contour = graphBasic.getDrawable(0) # Build a range of colors ot.ResourceMap.SetAsUnsignedInteger("Drawable-DefaultPalettePhase", len(levels)) palette = ot.Drawable.BuildDefaultPalette(len(levels)) # Create the drawables list, appending each contour with its own color drawables = list() for i in range(len(levels)): contour.setLevels([levels[i]]) # Inline the level values contour.setDrawLabels(True) # We have to copy the drawable because a Python list stores only pointers drawables.append(ot.Drawable(contour)) graphFineTune = ot.Graph("Branin metamodel (mean)", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables(drawables) graphFineTune.setLegendPosition("") graphFineTune.setColors(palette) .. GENERATED FROM PYTHON SOURCE LINES 148-149 We also represent the location of the minima of the Branin function : .. GENERATED FROM PYTHON SOURCE LINES 149-154 .. 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_002.png :alt: Branin metamodel (mean) :srcset: /auto_meta_modeling/kriging_metamodel/images/sphx_glr_plot_kriging_branin_function_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 155-156 We evaluate the metamodel at the minima locations : .. GENERATED FROM PYTHON SOURCE LINES 156-158 .. 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 159-162 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 165-170 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 172-173 We discretize the domain with 22 points (N inside points and 2 endpoints) : .. GENERATED FROM PYTHON SOURCE LINES 173-176 .. code-block:: Python N = 20 inputData = ot.Box([N, N]).generate() .. GENERATED FROM PYTHON SOURCE LINES 177-178 We compute the conditional variance of the model and take the square root to get the deviation : .. GENERATED FROM PYTHON SOURCE LINES 178-181 .. code-block:: Python condCov = result.getConditionalMarginalVariance(inputData, 0) condCovSd = sqrt(condCov) .. GENERATED FROM PYTHON SOURCE LINES 182-183 As we have previously done we build contours with the following levels ans labels : .. GENERATED FROM PYTHON SOURCE LINES 183-190 .. code-block:: Python levels = [0.01, 0.025, 0.050, 0.075, 0.1, 0.125, 0.150, 0.175] labels = ["0.01", "0.025", "0.050", "0.075", "0.1", "0.125", "0.150", "0.175"] contour = ot.Contour(N + 2, N + 2, condCovSd) graph = ot.Graph("", "x", "y", True, "") graph.add(contour) .. GENERATED FROM PYTHON SOURCE LINES 191-192 We use fancy colored isolines for the contour plot : .. GENERATED FROM PYTHON SOURCE LINES 192-206 .. code-block:: Python contour = graph.getDrawable(0) ot.ResourceMap.SetAsUnsignedInteger("Drawable-DefaultPalettePhase", len(levels)) palette = ot.Drawable.BuildDefaultPalette(len(levels)) drawables = list() for i in range(len(levels)): contour.setLevels([levels[i]]) contour.setDrawLabels(True) drawables.append(ot.Drawable(contour)) graphFineTune = ot.Graph("Standard deviation", r"$x_1$", r"$x_2$", True, "") graphFineTune.setDrawables(drawables) graphFineTune.setLegendPosition("") graphFineTune.setColors(palette) .. GENERATED FROM PYTHON SOURCE LINES 207-208 We superimpose the training sample : .. GENERATED FROM PYTHON SOURCE LINES 208-214 .. 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_003.png :alt: Standard deviation :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 215-218 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 218-220 .. 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 221-223 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 225-226 Display all figures .. GENERATED FROM PYTHON SOURCE LINES 226-228 .. code-block:: Python plt.show() .. GENERATED FROM PYTHON SOURCE LINES 229-230 Reset default settings .. GENERATED FROM PYTHON SOURCE LINES 230-231 .. 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 `