.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_meta_modeling/general_purpose_metamodels/plot_expert_mixture.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_general_purpose_metamodels_plot_expert_mixture.py: Mixture of experts ================== .. GENERATED FROM PYTHON SOURCE LINES 7-32 In this example we are going to approximate a piece wise continuous function using an expert mixture of metamodels. The metamodels will be represented by the family of functions :math:`f_k \forall \in [1, n_c]`: .. math:: f(\vect{x}) = f_k(\vect{x}) for any :math:`\vect{z} \in \textrm{Class}_k` where the :math:`n_c \in \Nset` classes are defined by the classifier. Using the supervised mode the classifier partitions the input and output spaces at once: .. math:: \vect{z} = (\vect{x}, f(\vect{x})) The classifier is :class:`~openturns.MixtureClassifier` based on a :class:`~openturns.Mixture` distribution defined as: .. math:: p(\vect{x}) = \sum_{i=1}^{n_c} w_i p_i(\vect{x}) The rule to assign a point to a class is defined as follows: :math:`\vect{x}` is assigned to the class :math:`j = \operatorname{argmax}_j \log w_k p_k(\vect{z})`. The grade of :math:`\vect{x}` with respect to the class :math:`k` is :math:`\log w_k p_k(\vect{x})`. .. GENERATED FROM PYTHON SOURCE LINES 34-41 .. code-block:: Python import openturns as ot from matplotlib import pyplot as plt import openturns.viewer as viewer import numpy as np ot.Log.Show(ot.Log.NONE) .. GENERATED FROM PYTHON SOURCE LINES 42-62 .. code-block:: Python dimension = 1 # Define the piecewise model we want to rebuild def piecewise(X): # if x < 0.0: # f = (x+0.75)**2-0.75**2 # else: # f = 2.0-x**2 xarray = np.asarray(X) return np.piecewise( xarray, [xarray < 0, xarray >= 0], [lambda x: x * (x + 1.5), lambda x: 2.0 - x * x], ) f = ot.PythonFunction(1, 1, func_sample=piecewise) .. GENERATED FROM PYTHON SOURCE LINES 63-64 Build a metamodel over each segment .. GENERATED FROM PYTHON SOURCE LINES 64-74 .. code-block:: Python degree = 5 samplingSize = 100 enumerateFunction = ot.LinearEnumerateFunction(dimension) productBasis = ot.OrthogonalProductPolynomialFactory( [ot.LegendreFactory()] * dimension, enumerateFunction ) adaptiveStrategy = ot.FixedStrategy( productBasis, enumerateFunction.getStrataCumulatedCardinal(degree) ) .. GENERATED FROM PYTHON SOURCE LINES 75-76 Interval 1: :math:`[-1.0; 0.0]` .. GENERATED FROM PYTHON SOURCE LINES 76-85 .. code-block:: Python d1 = ot.Uniform(-1.0, 0.0) X1 = d1.getSample(samplingSize) Y1 = f(X1) fc1 = ot.FunctionalChaosAlgorithm(X1, Y1, d1, adaptiveStrategy) fc1.run() mm1 = fc1.getResult().getMetaModel() graph = mm1.draw(-1.0, -1e-6) view = viewer.View(graph) .. image-sg:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_001.png :alt: y0 as a function of X0 :srcset: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 86-87 Interval 2: :math:`[0.0, 1.0]` .. GENERATED FROM PYTHON SOURCE LINES 87-96 .. code-block:: Python d2 = ot.Uniform(0.0, 1.0) X2 = d2.getSample(samplingSize) Y2 = f(X2) fc2 = ot.FunctionalChaosAlgorithm(X2, Y2, d2, adaptiveStrategy) fc2.run() mm2 = fc2.getResult().getMetaModel() graph = mm2.draw(1e-6, 1.0) view = viewer.View(graph) .. image-sg:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_002.png :alt: y0 as a function of X0 :srcset: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 97-98 Define the mixture .. GENERATED FROM PYTHON SOURCE LINES 98-105 .. code-block:: Python R = ot.CorrelationMatrix(2) d1 = ot.Normal([-1.0, -1.0], [1.0] * 2, R) # segment 1 d2 = ot.Normal([1.0, 1.0], [1.0] * 2, R) # segment 2 weights = [1.0] * 2 atoms = [d1, d2] mixture = ot.Mixture(atoms, weights) .. GENERATED FROM PYTHON SOURCE LINES 106-107 Create the classifier based on the mixture .. GENERATED FROM PYTHON SOURCE LINES 107-109 .. code-block:: Python classifier = ot.MixtureClassifier(mixture) .. GENERATED FROM PYTHON SOURCE LINES 110-111 Create local experts using the metamodels .. GENERATED FROM PYTHON SOURCE LINES 111-113 .. code-block:: Python experts = ot.Basis([mm1, mm2]) .. GENERATED FROM PYTHON SOURCE LINES 114-115 Create a mixture of experts .. GENERATED FROM PYTHON SOURCE LINES 115-118 .. code-block:: Python evaluation = ot.ExpertMixture(experts, classifier) moe = ot.Function(evaluation) .. GENERATED FROM PYTHON SOURCE LINES 119-120 Draw the mixture of experts .. GENERATED FROM PYTHON SOURCE LINES 120-123 .. code-block:: Python graph = moe.draw(-1.0, 1.0) view = viewer.View(graph) plt.show() .. image-sg:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_003.png :alt: y0 as a function of X0 :srcset: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_003.png :class: sphx-glr-single-img .. _sphx_glr_download_auto_meta_modeling_general_purpose_metamodels_plot_expert_mixture.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_expert_mixture.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_expert_mixture.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_expert_mixture.zip `