Оценка плотности с использованием ядра

Beginner

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

Введение

Kernel Density Estimation (KDE) - это метод непараметрической оценки плотности. В этом практическом занятии мы научимся использовать KDE для генерации новых выборок данных. Мы будем использовать библиотеку scikit-learn для реализации этого метода.

Советы по использованию ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка данных

Сначала мы загружаем набор данных digits из scikit-learn. Этот набор данных содержит изображения цифр 8x8 от 0 до 9. Мы будем использовать Анализ главных компонент (PCA), чтобы уменьшить размерность набора данных до 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)

Оптимизация ширины полосы

Мы используем кросс-валидацию по сетке для оптимизации параметра ширины полосы KDE. Параметр ширины полосы контролирует гладкость оценки плотности.

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_

Генерация новых выборок

Мы используем наилучший метод для отбора 44 новых точек из данных. Затем мы преобразуем новые данные обратно в исходные 64 измерения с использованием обратной матрицы PCA.

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

Построение результатов

Мы并排绘制原始数字和重新采样的数字,形成一个 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()

Обзор

В этом практическом занятии мы узнали, как использовать метод оценки плотности с использованием ядра (Kernel Density Estimation, KDE), чтобы генерировать новые выборки данных. Мы использовали библиотеку scikit-learn для реализации этой техники. Мы оптимизировали параметр ширины полосы KDE с использованием кросс-валидации по сетке. Затем мы отобрали новые точки данных и преобразовали их обратно в исходные размерности с использованием PCA. Наконец, мы并排 построили исходные цифры и переотобранные цифры в сетке 4x11.