Estimación de Densidad Kernel

Beginner

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

Introducción

La Estimación de Densidad Kernel (KDE, por sus siglas en inglés) es una técnica de estimación de densidad no paramétrica. En este laboratorio, aprenderemos a usar la KDE para generar nuevas muestras de datos. Usaremos la biblioteca scikit-learn para implementar esta técnica.

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 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.

Cargar datos

Primero, cargamos el conjunto de datos de dígitos de scikit-learn. Este conjunto de datos contiene imágenes de 8x8 de dígitos del 0 al 9. Usaremos Análisis de Componentes Principales (PCA, por sus siglas en inglés) para reducir la dimensión del conjunto de datos a 15.

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA

## load the digits dataset
digits = load_digits()

## reduce the dimension of the dataset to 15 using PCA
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

Optimizar el ancho de banda

Usamos la validación cruzada con búsqueda en cuadrícula para optimizar el parámetro de ancho de banda de la KDE. El parámetro de ancho de banda controla la suavidad de la estimación de densidad.

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
import numpy as np

## use grid search cross-validation to optimize the bandwidth
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("best bandwidth: {0}".format(grid.best_estimator_.bandwidth))

## use the best estimator to compute the kernel density estimate
kde = grid.best_estimator_

Generar nuevas muestras

Usamos el mejor estimador para tomar 44 nuevos puntos de muestra a partir de los datos. Luego transformamos los nuevos datos de vuelta a sus 64 dimensiones originales usando la inversa de PCA.

## sample 44 new points from the data
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

Graficar los resultados

Graficamos los dígitos originales y los dígitos resampleados lado a lado en una cuadrícula de 4x11.

import matplotlib.pyplot as plt

## turn data into a 4x11 grid
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## plot real digits and resampled digits
fig, ax = plt.subplots(9, 11, subplot_kw=dict(xticks=[], yticks=[]))
for j in range(11):
    ax[4, j].set_visible(False)
    for i in range(4):
        im = ax[i, j].imshow(
            real_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)
        im = ax[i + 5, j].imshow(
            new_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)

ax[0, 5].set_title("Selection from the input data")
ax[5, 5].set_title('"New" digits drawn from the kernel density model')

plt.show()

Resumen

En este laboratorio, aprendimos cómo usar la Estimación de Densidad Kernel (KDE, por sus siglas en inglés) para generar nuevas muestras de datos. Usamos la biblioteca scikit-learn para implementar esta técnica. Optimizamos el parámetro de ancho de banda de la KDE usando la validación cruzada con búsqueda en cuadrícula. Luego tomamos muestras de nuevos puntos de datos y los transformamos de vuelta a su dimensión original usando PCA. Finalmente, graficamos los dígitos originales y los dígitos resampleados lado a lado en una cuadrícula de 4x11.