Estimativa de Densidade Kernel

Beginner

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

Introdução

A Estimativa de Densidade Kernel (KDE) é uma técnica de estimativa de densidade não paramétrica. Neste laboratório, aprenderemos como usar KDE para gerar novas amostras de dados. Usaremos a biblioteca scikit-learn para implementar esta técnica.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

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 o problema rapidamente para si.

Carregar Dados

Primeiro, carregamos o conjunto de dados de dígitos do scikit-learn. Este conjunto de dados contém imagens de 8x8 de dígitos de 0 a 9. Usaremos Análise de Componentes Principais (PCA) para reduzir a dimensão do conjunto de dados para 15.

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

## carregar o conjunto de dados de dígitos
digits = load_digits()

## reduzir a dimensão do conjunto de dados para 15 usando PCA
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

Otimizar a Largura de Banda

Utilizamos a validação cruzada por busca em grade para otimizar o parâmetro de largura de banda do KDE. O parâmetro de largura de banda controla a suavidade da estimativa de densidade.

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

## usar validação cruzada por busca em grade para otimizar a largura de banda
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("melhor largura de banda: {0}".format(grid.best_estimator_.bandwidth))

## usar o melhor estimador para calcular a estimativa de densidade do kernel
kde = grid.best_estimator_

Gerar Novas Amostras

Usamos o melhor estimador para amostrar 44 novos pontos dos dados. Em seguida, transformamos os novos dados de volta para suas 64 dimensões originais usando a inversa da PCA.

## amostrar 44 novos pontos dos dados
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

Plotar Resultados

Plotamos os dígitos originais e os dígitos reamostrados lado a lado em uma grade de 4x11.

import matplotlib.pyplot as plt

## transformar os dados em uma grade 4x11
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## plotar os dígitos reais e os dígitos reamostrados
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("Seleção dos dados de entrada")
ax[5, 5].set_title('"Novos" dígitos extraídos do modelo de densidade do kernel')

plt.show()

Resumo

Neste laboratório, aprendemos como usar a Estimativa de Densidade Kernel (KDE) para gerar novas amostras de dados. Usamos a biblioteca scikit-learn para implementar essa técnica. Otimizamos o parâmetro de largura de banda do KDE usando busca em grade com validação cruzada. Em seguida, amostramos novos pontos de dados e os transformamos de volta à sua dimensão original usando PCA. Finalmente, plotamos os dígitos originais e os dígitos reamostrados lado a lado em uma grade de 4x11.