.. 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 6-37 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 :math:`f_k \forall \in [1, N]`: .. math:: \begin{align} f(\underline{x}) = f_1(\underline{x}) \quad \forall \underline{z} \in Class\, 1 \dots f(\underline{x}) = f_k(\underline{x}) \quad \forall \underline{z} \in Class\, k \dots f(\underline{x}) = f_N(\underline{x}) \quad \forall \underline{z} \in Class\, N \end{align} where the N classes are defined by the classifier. Using the supervised mode the classifier partitions the input and output space at once: .. math:: z =(\underline{x}, f( \underline{x})) The classifier is MixtureClassifier based on a MixtureDistribution defined as: .. math:: p(\underline{x}) = \sum_{i=1}^N w_ip_i(\underline{x}) The rule to assign a point to a class is defined as follows: :math:`\underline{x}` is assigned to the class :math:`j=argmax_j \log w_kp_k(\underline{z})`. The grade of :math:`\underline{x}` with respect to the class :math:`k` is :math:`\log w_kp_k(\underline{x})`. .. GENERATED FROM PYTHON SOURCE LINES 39-46 .. 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 47-67 .. 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.array(X, copy=False) 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 68-69 Build a metamodel over each segment .. GENERATED FROM PYTHON SOURCE LINES 69-79 .. 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 80-81 Segment 1: (-1.0; 0.0) .. GENERATED FROM PYTHON SOURCE LINES 81-90 .. 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 91-92 Segment 2: (0.0, 1.0) .. GENERATED FROM PYTHON SOURCE LINES 92-101 .. 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 102-103 Define the mixture .. GENERATED FROM PYTHON SOURCE LINES 103-110 .. 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 111-112 Create the classifier based on the mixture .. GENERATED FROM PYTHON SOURCE LINES 112-114 .. code-block:: Python classifier = ot.MixtureClassifier(mixture) .. GENERATED FROM PYTHON SOURCE LINES 115-116 Create local experts using the metamodels .. GENERATED FROM PYTHON SOURCE LINES 116-118 .. code-block:: Python experts = ot.Basis([mm1, mm2]) .. GENERATED FROM PYTHON SOURCE LINES 119-120 Create a mixture of experts .. GENERATED FROM PYTHON SOURCE LINES 120-123 .. code-block:: Python evaluation = ot.ExpertMixture(experts, classifier) moe = ot.Function(evaluation) .. GENERATED FROM PYTHON SOURCE LINES 124-125 Draw the mixture of experts .. GENERATED FROM PYTHON SOURCE LINES 125-128 .. 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 `