Introdução
Neste laboratório, utilizaremos o algoritmo Gaussian Mixture Model (GMM) para ajustar um conjunto de dados que segue uma curva senoidal com ruído. Usaremos dois tipos diferentes de Gaussian Mixture Models, nomeadamente o algoritmo Expectation-Maximization (EM) e o Gaussian Mixture Model Bayesiano com uma prior de processo Dirichlet.
Dicas da Máquina Virtual (VM)
Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.
Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.
Carregar Bibliotecas Necessárias
Começaremos carregando as bibliotecas necessárias para este laboratório.
import itertools
import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import mixture
Gerar Conjunto de Dados
Em seguida, geraremos um conjunto de dados que segue uma curva senoidal com ruído.
## Parâmetros
n_samples = 100
## Gerar amostra aleatória seguindo uma curva senoidal
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 um Modelo de Mistura Gaussiana com EM
Ajustaremos um modelo clássico de Mistura Gaussiana com 10 componentes, ajustado com o algoritmo Expectation-Maximization.
## Ajustar uma mistura gaussiana com EM usando dez componentes
gmm = mixture.GaussianMixture(
n_components=10, covariance_type="full", max_iter=100
).fit(X)
Plotar os Resultados do Algoritmo EM
Plotaremos os resultados do algoritmo Expectation-Maximization.
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 o DP não usará todos os componentes a que tem acesso
## a menos que precise deles, não devemos plotar os componentes redundantes.
if not np.any(Y == i):
continue
plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)
## Plotar uma elipse para mostrar o componente gaussiano
angle = np.arctan(u[1] / u[0])
angle = 180.0 * angle / np.pi ## converter para graus
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 um Modelo de Mistura Gaussiana Bayesiano com uma Prior de Processo Dirichlet
Agora, ajustaremos um Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet. Definiremos um valor baixo para a prior de concentração para fazer com que o modelo favoreça um número menor de componentes ativos.
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)
Plotar os Resultados do Modelo GMM Bayesiano com Prior de Concentração Baixa
Plotaremos os resultados do Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet e um valor baixo para a prior de concentração.
plot_results(
X,
dpgmm.predict(X),
dpgmm.means_,
dpgmm.covariances_,
1,
"Modelos de mistura gaussiana bayesianos com uma prior de processo Dirichlet "
r"para $\gamma_0=0.01$.",
)
Amostrar do Modelo GMM Bayesiano com Prior de Concentração Baixa
Agora, amostraremos do Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet e um valor baixo para a prior de concentração.
X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
X_s,
y_s,
dpgmm.n_components,
0,
"Mistura gaussiana com uma prior de processo Dirichlet "
r"para $\gamma_0=0.01$ amostrada com $2000$ amostras.",
)
Ajustar um Modelo de Mistura Gaussiana Bayesiano com uma Prior de Processo Dirichlet
Agora, ajustaremos um Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet. Definiremos um valor alto para a prior de concentração para dar ao modelo mais liberdade para modelar a estrutura detalhada dos dados.
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)
Plotar os Resultados do Modelo GMM Bayesiano com Prior de Concentração Alta
Plotaremos os resultados do Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet e um valor alto para a prior de concentração.
plot_results(
X,
dpgmm.predict(X),
dpgmm.means_,
dpgmm.covariances_,
2,
"Modelos de mistura gaussiana bayesianos com uma prior de processo Dirichlet "
r"para $\gamma_0=100$",
)
Amostrar do Modelo GMM Bayesiano com Prior de Concentração Alta
Agora, amostraremos do Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet e um valor alto para a prior de concentração.
X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
X_s,
y_s,
dpgmm.n_components,
1,
"Mistura gaussiana com uma prior de processo Dirichlet "
r"para $\gamma_0=100$ amostrada com $2000$ amostras.",
)
Resumo
Neste laboratório, utilizamos o algoritmo de Modelo de Mistura Gaussiana para ajustar um conjunto de dados que segue uma curva senoidal com ruído. Usamos dois tipos diferentes de Modelos de Mistura Gaussiana, nomeadamente o algoritmo Expectation-Maximization e o Modelo de Mistura Gaussiana Bayesiano com uma prior de processo Dirichlet. Plotamos os resultados e amostramos de ambos os modelos para comparar o seu desempenho. A escolha do melhor modelo é subjetiva e depende se queremos focar na visão geral ou seguir de perto as regiões de alta densidade do sinal.