Métodos de inicialización del Modelo de Mezcla Gaussiana

Beginner

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

Introducción

En este laboratorio, aprenderemos sobre diferentes métodos de inicialización para los Modelos Mixtos Gausianos (GMM). Usaremos la biblioteca scikit-learn para generar datos de muestra y visualizar los resultados de clustering. Hay cuatro métodos diferentes para el parámetro de inicialización init_param: kmeans (predeterminado), random, random_from_data y k-means++.

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 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 comentarios después de la sesión y resolveremos rápidamente el problema para usted.

Importar bibliotecas y generar datos de muestra

Comenzaremos importando las bibliotecas necesarias y generando algunos datos de muestra utilizando la función make_blobs de 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

## Generate some data
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 una función para obtener los promedios iniciales

A continuación, definiremos una función get_initial_means que toma los datos de muestra, el método de inicialización y el estado aleatorio como entradas y devuelve los promedios de inicialización.

def get_initial_means(X, init_params, r):
    ## Run a GaussianMixture with max_iter=0 to output the initialization means
    gmm = GaussianMixture(
        n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r
    ).fit(X)
    return gmm.means_

Graficar los datos de muestra y los centros de inicialización

Ahora graficaremos los datos de muestra y los centros de inicialización para cada método de inicialización utilizando diferentes colores. También calcularemos el tiempo que toma la inicialización y el número de iteraciones que toma para que el GMM converja.

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("GMM iterations and relative time taken to initialize")
plt.show()

Interpretar los resultados

Podemos ver en la gráfica que k-means++ tiene un buen desempeño tanto en cuanto al tiempo de inicialización bajo como al bajo número de iteraciones del GaussianMixture para converger. Cuando se inicializa con random_from_data o random, el modelo toma más iteraciones para converger. Los tres métodos alternativos toman menos tiempo para inicializar en comparación con kmeans.

Resumen

En este laboratorio, aprendimos sobre diferentes métodos de inicialización para los Modelos de Mezcla Gaussiana (GMM) y cómo utilizarlos para agrupar datos de muestra utilizando la biblioteca scikit-learn. Graficamos los datos de muestra y los centros de inicialización para cada método de inicialización e interpretamos los resultados.