.. 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 7-10 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 12-19 .. 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 20-21 We load the Branin-Hoo model from the usecases module and use the model (stored in `objectiveFunction`) .. GENERATED FROM PYTHON SOURCE LINES 21-24 .. code-block:: Python bm = branin_function.BraninModel() model = bm.objectiveFunction .. GENERATED FROM PYTHON SOURCE LINES 25-27 We shall represent this 2-d 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 27-31 .. 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 32-33 We get the values of all isolines : .. GENERATED FROM PYTHON SOURCE LINES 33-47 .. 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 48-49 We also represent the three minima of the Branin function with orange diamonds : .. GENERATED FROM PYTHON SOURCE LINES 49-59 .. 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 60-62 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 65-70 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 training points in `xdata` .. GENERATED FROM PYTHON SOURCE LINES 70-78 .. 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 79-80 We also get the output training values : .. GENERATED FROM PYTHON SOURCE LINES 80-83 .. code-block:: Python ydata = bm.objectiveFunction(xdata) .. GENERATED FROM PYTHON SOURCE LINES 84-85 This use case is defined in dimension 2 and we use a constant basis for the trend estimation : .. GENERATED FROM PYTHON SOURCE LINES 85-88 .. code-block:: Python dimension = bm.dim basis = ot.ConstantBasisFactory(dimension).build() .. GENERATED FROM PYTHON SOURCE LINES 89-90 We choose a squared exponential covariance model in dimension 2 : .. GENERATED FROM PYTHON SOURCE LINES 90-92 .. code-block:: Python covarianceModel = ot.SquaredExponential([0.1] * dimension, [1.0]) .. GENERATED FROM PYTHON SOURCE LINES 93-94 We have all the components to build a Kriging algorithm and run it : .. GENERATED FROM PYTHON SOURCE LINES 94-97 .. code-block:: Python algo = ot.KrigingAlgorithm(xdata, ydata, covarianceModel, basis) algo.run() .. GENERATED FROM PYTHON SOURCE LINES 98-99 We get the result of the Kriging analysis with : .. GENERATED FROM PYTHON SOURCE LINES 99-101 .. code-block:: Python result = algo.getResult() .. GENERATED FROM PYTHON SOURCE LINES 102-106 Metamodel visualization ----------------------- We draw the Kriging metamodel of the Branin function. It is the mean of the random process. .. GENERATED FROM PYTHON SOURCE LINES 106-124 .. 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 125-126 We also represent the location of the minima of the Branin function : .. GENERATED FROM PYTHON SOURCE LINES 126-131 .. 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 132-133 We evaluate the metamodel at the minima locations : .. GENERATED FROM PYTHON SOURCE LINES 133-135 .. code-block:: Python print(metamodel(sample1)) .. rst-class:: sphx-glr-script-out .. code-block:: none 0 : [ -1.05262 ] 1 : [ -1.04898 ] 2 : [ -1.06902 ] .. GENERATED FROM PYTHON SOURCE LINES 136-139 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 142-147 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 149-150 We discretize the domain with 22 points (`N` inside points and 2 endpoints) : .. GENERATED FROM PYTHON SOURCE LINES 150-153 .. code-block:: Python N = 20 inputData = ot.Box([N, N]).generate() .. GENERATED FROM PYTHON SOURCE LINES 154-155 We compute the conditional variance of the model and take the square root to get the deviation : .. GENERATED FROM PYTHON SOURCE LINES 155-158 .. code-block:: Python condCov = result.getConditionalMarginalVariance(inputData, 0) condCovSd = sqrt(condCov) .. GENERATED FROM PYTHON SOURCE LINES 159-160 As we have previously done we build contours with the following levels ans labels : .. GENERATED FROM PYTHON SOURCE LINES 160-167 .. 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 168-169 We superimpose the training sample : .. GENERATED FROM PYTHON SOURCE LINES 169-175 .. 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 176-179 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 179-181 .. code-block:: Python print(result.getConditionalMarginalVariance(xdata, 0)[0:5]) .. rst-class:: sphx-glr-script-out .. code-block:: none [ v0 ] 0 : [ 3.39394e-24 ] 1 : [ 1.40834e-26 ] 2 : [ 2.30742e-24 ] 3 : [ 2.84217e-14 ] 4 : [ 8.29849e-25 ] .. GENERATED FROM PYTHON SOURCE LINES 182-184 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 186-187 Display all figures .. GENERATED FROM PYTHON SOURCE LINES 187-189 .. code-block:: Python plt.show() .. GENERATED FROM PYTHON SOURCE LINES 190-191 Reset default settings .. GENERATED FROM PYTHON SOURCE LINES 191-192 .. 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 ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_kriging_branin_function.zip `