Métodos de Inicialização de Modelos de Mistura Gaussiana

Beginner

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

Introdução

Neste laboratório, aprenderemos sobre diferentes métodos de inicialização para Modelos de Mistura Gaussiana (GMM). Usaremos a biblioteca scikit-learn para gerar dados de amostra e visualizar os resultados de agrupamento. Existem quatro métodos diferentes para o parâmetro de inicialização _init_param_: kmeans (padrão), random, random_from_data e k-means++.

Dicas da Máquina Virtual

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 o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar bibliotecas e gerar dados de amostra

Começaremos importando as bibliotecas necessárias e gerando alguns dados de amostra usando a função make_blobs do scikit-learn.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.utils.extmath import row_norms
from sklearn.datasets._samples_generator import make_blobs
from timeit import default_timer as timer

## Gerar alguns dados
X, y_true = make_blobs(n_samples=4000, centers=4, cluster_std=0.60, random_state=0)
X = X[:, ::-1]

n_samples = 4000
n_components = 4
x_squared_norms = row_norms(X, squared=True)

Definir uma função para obter as médias iniciais

Em seguida, definiremos uma função get_initial_means que recebe os dados de amostra, o método de inicialização e o estado aleatório como entradas e retorna as médias de inicialização.

def get_initial_means(X, init_params, r):
    ## Executar um GaussianMixture com max_iter=0 para produzir as médias de inicialização
    gmm = GaussianMixture(
        n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r
    ).fit(X)
    return gmm.means_

Plotar os dados de amostra e os centros de inicialização

Agora, plotaremos os dados de amostra e os centros de inicialização para cada método de inicialização usando cores diferentes. Também calcularemos o tempo necessário para a inicialização e o número de iterações necessárias para o GMM convergir.

methods = ["kmeans", "random_from_data", "k-means++", "random"]
colors = ["navy", "turquoise", "cornflowerblue", "darkorange"]
times_init = {}
relative_times = {}

plt.figure(figsize=(4 * len(methods) // 2, 6))
plt.subplots_adjust(
    bottom=0.1, top=0.9, hspace=0.15, wspace=0.05, left=0.05, right=0.95
)

for n, method in enumerate(methods):
    r = np.random.RandomState(seed=1234)
    plt.subplot(2, len(methods) // 2, n + 1)

    start = timer()
    ini = get_initial_means(X, method, r)
    end = timer()
    init_time = end - start

    gmm = GaussianMixture(
        n_components=4, means_init=ini, tol=1e-9, max_iter=2000, random_state=r
    ).fit(X)

    times_init[method] = init_time
    for i, color in enumerate(colors):
        data = X[gmm.predict(X) == i]
        plt.scatter(data[:, 0], data[:, 1], color=color, marker="x")

    plt.scatter(
        ini[:, 0], ini[:, 1], s=75, marker="D", c="orange", lw=1.5, edgecolors="black"
    )
    relative_times[method] = times_init[method] / times_init[methods[0]]

    plt.xticks(())
    plt.yticks(())
    plt.title(method, loc="left", fontsize=12)
    plt.title(
        "Iter %i | Init Time %.2fx" % (gmm.n_iter_, relative_times[method]),
        loc="right",
        fontsize=10,
    )
plt.suptitle("Iterações do GMM e tempo relativo para inicialização")
plt.show()

Interpretar os resultados

Podemos observar no gráfico que o método k-means++ apresenta um bom desempenho, tanto em tempo de inicialização baixo quanto em um baixo número de iterações do GaussianMixture para convergir. Quando inicializado com random_from_data ou random, o modelo leva mais iterações para convergir. Todos os três métodos alternativos levam menos tempo para inicializar em comparação com o kmeans.

Resumo

Neste laboratório, aprendemos sobre diferentes métodos de inicialização para Modelos de Mistura Gaussiana (GMM) e como utilizá-los para agrupar dados de amostra usando a biblioteca scikit-learn. Plotamos os dados de amostra e os centros de inicialização para cada método de inicialização e interpretamos os resultados.