.. only:: html
.. note::
:class: sphx-glr-download-link-note
Click :ref:`here ` 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
==================
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})`.
.. code-block:: default
from __future__ import print_function
import openturns as ot
from matplotlib import pyplot as plt
import openturns.viewer as viewer
from matplotlib import pylab as plt
from openturns.viewer import View
import numpy as np
ot.Log.Show(ot.Log.NONE)
.. code-block:: default
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)
Build a metamodel over each segment
.. code-block:: default
degree = 5
samplingSize = 100
enumerateFunction = ot.LinearEnumerateFunction(dimension)
productBasis = ot.OrthogonalProductPolynomialFactory([ot.LegendreFactory()] * dimension, enumerateFunction)
adaptiveStrategy = ot.FixedStrategy(productBasis, enumerateFunction.getStrataCumulatedCardinal(degree))
projectionStrategy = ot.LeastSquaresStrategy(ot.MonteCarloExperiment(samplingSize))
Segment 1: (-1.0; 0.0)
.. code-block:: default
d1 = ot.Uniform(-1.0, 0.0)
fc1 = ot.FunctionalChaosAlgorithm(f, d1, adaptiveStrategy, projectionStrategy)
fc1.run()
mm1 = fc1.getResult().getMetaModel()
graph = mm1.draw(-1.0, -1e-6)
view = viewer.View(graph)
.. image:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_001.png
:alt: v0 as a function of x0
:class: sphx-glr-single-img
Segment 2: (0.0, 1.0)
.. code-block:: default
d2 = ot.Uniform(0.0, 1.0)
fc2 = ot.FunctionalChaosAlgorithm(f, d2, adaptiveStrategy, projectionStrategy)
fc2.run()
mm2 = fc2.getResult().getMetaModel()
graph = mm2.draw(1e-6,1.0)
view = viewer.View(graph)
.. image:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_002.png
:alt: v0 as a function of x0
:class: sphx-glr-single-img
Define the mixture
.. code-block:: default
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)
Create the classifier based on the mixture
.. code-block:: default
classifier = ot.MixtureClassifier(mixture)
Create local experts using the metamodels
.. code-block:: default
experts = ot.Basis([mm1, mm2])
Create a mixture of experts
.. code-block:: default
evaluation = ot.ExpertMixture(experts, classifier)
moe = ot.Function(evaluation)
Draw the mixture of experts
.. code-block:: default
graph = moe.draw(-1.0, 1.0)
view = viewer.View(graph)
plt.show()
.. image:: /auto_meta_modeling/general_purpose_metamodels/images/sphx_glr_plot_expert_mixture_003.png
:alt: v0 as a function of x0
:class: sphx-glr-single-img
.. rst-class:: sphx-glr-timing
**Total running time of the script:** ( 0 minutes 0.223 seconds)
.. _sphx_glr_download_auto_meta_modeling_general_purpose_metamodels_plot_expert_mixture.py:
.. only :: html
.. container:: sphx-glr-footer
:class: sphx-glr-footer-example
.. container:: sphx-glr-download sphx-glr-download-python
:download:`Download Python source code: plot_expert_mixture.py `
.. container:: sphx-glr-download sphx-glr-download-jupyter
:download:`Download Jupyter notebook: plot_expert_mixture.ipynb `
.. only:: html
.. rst-class:: sphx-glr-signature
`Gallery generated by Sphinx-Gallery `_