Graficar la prioridad de concentración

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar la clase BayesianGaussianMixture de scikit-learn para ajustar un conjunto de datos de ejemplo que contiene una mezcla de tres distribuciones gaussianas. La clase puede adaptar automáticamente el número de componentes de mezcla utilizando una prioridad de concentración, que se especifica utilizando el parámetro weight_concentration_prior_type. Esta práctica muestra la diferencia entre utilizar una prioridad de distribución de Dirichlet y una prioridad de proceso de Dirichlet para seleccionar el número de componentes con pesos no nulos.

Consejos sobre la VM

Una vez finalizada la inicialización de 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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/mixture("Gaussian Mixture Models") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/mixture -.-> lab-49093{{"Graficar la prioridad de concentración"}} ml/sklearn -.-> lab-49093{{"Graficar la prioridad de concentración"}} end

Importar bibliotecas

En este paso, importaremos las bibliotecas necesarias, que son numpy, matplotlib, gridspec y BayesianGaussianMixture de sklearn.mixture.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from sklearn.mixture import BayesianGaussianMixture

Definir funciones

En este paso, definimos dos funciones. La primera función grafica los elipses obtenidos a partir del conjunto de datos de ejemplo ajustado por los modelos de la clase BayesianGaussianMixture. La segunda función grafica los resultados para tres valores diferentes de la prioridad de concentración de pesos.

def plot_ellipses(ax, weights, means, covars):
    for n in range(means.shape[0]):
        eig_vals, eig_vecs = np.linalg.eigh(covars[n])
        unit_eig_vec = eig_vecs[0] / np.linalg.norm(eig_vecs[0])
        angle = np.arctan2(unit_eig_vec[1], unit_eig_vec[0])
        angle = 180 * angle / np.pi
        eig_vals = 2 * np.sqrt(2) * np.sqrt(eig_vals)
        ell = mpl.patches.Ellipse(
            means[n], eig_vals[0], eig_vals[1], angle=180 + angle, edgecolor="black"
        )
        ell.set_clip_box(ax.bbox)
        ell.set_alpha(weights[n])
        ell.set_facecolor("#56B4E9")
        ax.add_artist(ell)

def plot_results(ax1, ax2, estimator, X, y, title, plot_title=False):
    ax1.set_title(title)
    ax1.scatter(X[:, 0], X[:, 1], s=5, marker="o", color=colors[y], alpha=0.8)
    ax1.set_xlim(-2.0, 2.0)
    ax1.set_ylim(-3.0, 3.0)
    ax1.set_xticks(())
    ax1.set_yticks(())
    plot_ellipses(ax1, estimator.weights_, estimator.means_, estimator.covariances_)

    ax2.get_xaxis().set_tick_params(direction="out")
    ax2.yaxis.grid(True, alpha=0.7)
    for k, w in enumerate(estimator.weights_):
        ax2.bar(
            k,
            w,
            width=0.9,
            color="#56B4E9",
            zorder=3,
            align="center",
            edgecolor="black",
        )
        ax2.text(k, w + 0.007, "%.1f%%" % (w * 100.0), horizontalalignment="center")
    ax2.set_xlim(-0.6, 2 * n_components - 0.4)
    ax2.set_ylim(0.0, 1.1)
    ax2.tick_params(axis="y", which="both", left=False, right=False, labelleft=False)
    ax2.tick_params(axis="x", which="both", top=False)
    if plot_title:
        ax1.set_ylabel("Estimated Mixtures")
        ax2.set_ylabel("Weight of each component")

Establecer parámetros para el conjunto de datos de ejemplo

En este paso, establecemos los parámetros para el conjunto de datos de ejemplo, que incluyen el estado aleatorio, el número de componentes, el número de características, los colores, las covarianzas, las muestras y las medias.

random_state, n_components, n_features = 2, 3, 2
colors = np.array(["#0072B2", "#F0E442", "#D55E00"])
covars = np.array(
    [[[0.7, 0.0], [0.0, 0.1]], [[0.5, 0.0], [0.0, 0.1]], [[0.5, 0.0], [0.0, 0.1]]]
)
samples = np.array([200, 500, 200])
means = np.array([[0.0, -0.70], [0.0, 0.0], [0.0, 0.70]])

Definir estimadores

En este paso, definimos dos estimadores. El primer estimador utiliza una prioridad de distribución de Dirichlet para establecer el número de componentes con pesos no nulos. El segundo estimador utiliza una prioridad de proceso de Dirichlet para seleccionar el número de componentes.

estimators = [
    (
        "Mezcla finita con una distribución de Dirichlet\nprior y " r"$\gamma_0=$",
        BayesianGaussianMixture(
            weight_concentration_prior_type="dirichlet_distribution",
            n_components=2 * n_components,
            reg_covar=0,
            init_params="random",
            max_iter=1500,
            mean_precision_prior=0.8,
            random_state=random_state,
        ),
        [0.001, 1, 1000],
    ),
    (
        "Mezcla infinita con un proceso de Dirichlet\n prior y" r"$\gamma_0=$",
        BayesianGaussianMixture(
            weight_concentration_prior_type="dirichlet_process",
            n_components=2 * n_components,
            reg_covar=0,
            init_params="random",
            max_iter=1500,
            mean_precision_prior=0.8,
            random_state=random_state,
        ),
        [1, 1000, 100000],
    ),
]

Generar datos

En este paso, generamos datos utilizando la función numpy.random.RandomState y los parámetros definidos en el Paso 3.

rng = np.random.RandomState(random_state)
X = np.vstack(
    [
        rng.multivariate_normal(means[j], covars[j], samples[j])
        for j in range(n_components)
    ]
)
y = np.concatenate([np.full(samples[j], j, dtype=int) for j in range(n_components)])

Graficar resultados

En este paso, graficamos los resultados para cada estimador utilizando la función plot_results definida en el Paso 2.

for title, estimator, concentrations_prior in estimators:
    plt.figure(figsize=(4.7 * 3, 8))
    plt.subplots_adjust(
        bottom=0.04, top=0.90, hspace=0.05, wspace=0.05, left=0.03, right=0.99
    )

    gs = gridspec.GridSpec(3, len(concentrations_prior))
    for k, concentration in enumerate(concentrations_prior):
        estimator.weight_concentration_prior = concentration
        estimator.fit(X)
        plot_results(
            plt.subplot(gs[0:2, k]),
            plt.subplot(gs[2, k]),
            estimator,
            X,
            y,
            r"%s$%.1e$" % (title, concentration),
            plot_title=k == 0,
        )

plt.show()

Resumen

Esta práctica mostró cómo utilizar la clase BayesianGaussianMixture de scikit-learn para ajustar un conjunto de datos de ejemplo que contiene una mezcla de tres distribuciones gaussianas. La clase puede adaptar automáticamente el número de componentes de mezcla utilizando una prioridad de concentración, que se especifica utilizando el parámetro weight_concentration_prior_type. Esta práctica mostró la diferencia entre utilizar una prioridad de distribución de Dirichlet y una prioridad de proceso de Dirichlet para seleccionar el número de componentes con pesos no nulos.