Modelo mixto gaussiano y curva sinusoidal

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, usaremos el algoritmo del modelo mixto gaussiano para ajustar un conjunto de datos que sigue una curva sinusoidal ruidosa. Usaremos dos tipos diferentes de modelos mixtos gaussianos, a saber, el algoritmo de Expectación-Maximización y el modelo mixto gaussiano bayesiano con una distribución Dirichlet como prior.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49138{{"Modelo mixto gaussiano y curva sinusoidal"}} end

Cargar las bibliotecas necesarias

Comenzaremos cargando las bibliotecas necesarias para este laboratorio.

import itertools

import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn import mixture

Generar el conjunto de datos

A continuación, generaremos un conjunto de datos que siga una curva sinusoidal ruidosa.

## Parámetros
n_samples = 100

## Generar muestra aleatoria siguiendo una curva sinusoidal
np.random.seed(0)
X = np.zeros((n_samples, 2))
step = 4.0 * np.pi / n_samples

for i in range(X.shape[0]):
    x = i * step - 6.0
    X[i, 0] = x + np.random.normal(0, 0.1)
    X[i, 1] = 3.0 * (np.sin(x) + np.random.normal(0, 0.2))

Ajustar un modelo mixto gaussiano con EM

Ajustaremos un modelo mixto gaussiano clásico con 10 componentes utilizando el algoritmo de Expectación-Maximización.

## Ajustar una mezcla gaussiana con EM utilizando diez componentes
gmm = mixture.GaussianMixture(
    n_components=10, covariance_type="full", max_iter=100
).fit(X)

Graficar los resultados del algoritmo EM

Graficaremos los resultados del algoritmo de Expectación-Maximización.

def plot_results(X, Y, means, covariances, index, title):
    splot = plt.subplot(5, 1, 1 + index)
    for i, (mean, covar, color) in enumerate(zip(means, covariances, color_iter)):
        v, w = linalg.eigh(covar)
        v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        ## como el DP no usará todos los componentes a los que tiene acceso
        ## a menos que los necesite, no deberíamos graficar los componentes
        ## redundantes.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)

        ## Grafica una elipse para mostrar el componente gaussiano
        angle = np.arctan(u[1] / u[0])
        angle = 180.0 * angle / np.pi  ## convierte a grados
        ell = mpl.patches.Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-6.0, 4.0 * np.pi - 6.0)
    plt.ylim(-5.0, 5.0)
    plt.title(title)
    plt.xticks(())
    plt.yticks(())

plot_results(
    X, gmm.predict(X), gmm.means_, gmm.covariances_, 0, "Expectation-maximization"
)

Ajustar un modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet

Ahora ajustaremos un modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet. Estableceremos un valor bajo de la concentración a priori para que el modelo favorezca un número menor de componentes activos.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e-2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="random",
    max_iter=100,
    random_state=2,
).fit(X)

Graficar los resultados del modelo mixto gaussiano bayesiano con una distribución a priori de baja concentración

Graficaremos los resultados del modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet y un valor bajo de la concentración a priori.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    1,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=0.01$.",
)

Tomar muestras del modelo mixto gaussiano bayesiano con una distribución a priori de baja concentración

Ahora tomaremos muestras del modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet y un valor bajo de la concentración a priori.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    0,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=0.01$ sampled with $2000$ samples.",
)

Ajustar un modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet

Ahora ajustaremos un modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet. Estableceremos un valor alto de la concentración a priori para dar al modelo más libertad para modelar la estructura de detalle de los datos.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="kmeans",
    max_iter=100,
    random_state=2,
).fit(X)

Graficar los resultados del modelo mixto gaussiano bayesiano con una distribución a priori de alta concentración

Graficaremos los resultados del modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet y un valor alto de la concentración a priori.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    2,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=100$",
)

Tomar muestras del modelo mixto gaussiano bayesiano con una distribución a priori de alta concentración

Ahora tomaremos muestras del modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet y un valor alto de la concentración a priori.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    1,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=100$ sampled with $2000$ samples.",
)

Resumen

En este laboratorio, utilizamos el algoritmo del modelo mixto gaussiano para ajustar un conjunto de datos que sigue una curva sinusoidal ruidosa. Utilizamos dos tipos diferentes de modelos mixtos gaussianos, a saber, el algoritmo de Expectación-Maximización y el modelo mixto gaussiano bayesiano con una distribución a priori de proceso de Dirichlet. Graficamos los resultados y tomamos muestras de ambos modelos para comparar su rendimiento. La elección del mejor modelo es subjetiva y depende de si queremos enfocarnos en la imagen general o seguir de cerca las regiones de alta densidad de la señal.