Modelo de Mistura Gaussiana para Curva Senoidal Ruidosa

Beginner

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

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.