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.
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.