核密度估计

Beginner

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

简介

核密度估计(Kernel Density Estimation,KDE)是一种非参数密度估计技术。在本实验中,我们将学习如何使用 KDE 生成新的数据样本。我们将使用 scikit-learn 库来实现此技术。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

加载数据

首先,我们从 scikit-learn 中加载数字数据集。这个数据集包含了从 0 到 9 的数字的 8x8 图像。我们将使用主成分分析(Principal Component Analysis,PCA)将数据集的维度降至 15。

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

## 加载数字数据集
digits = load_digits()

## 使用 PCA 将数据集的维度降至 15
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

## 使用网格搜索交叉验证来优化带宽
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("最佳带宽:{0}".format(grid.best_estimator_.bandwidth))

## 使用最佳估计器计算核密度估计
kde = grid.best_estimator_

生成新样本

我们使用最佳估计器从数据中采样 44 个新点。然后,我们使用 PCA 的逆变换将新数据转换回其原始的 64 维。

## 从数据中采样 44 个新点
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

绘制结果

我们将原始数字和重新采样后的数字并排绘制在一个 4x11 的网格中。

import matplotlib.pyplot as plt

## 将数据转换为 4x11 的网格
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## 绘制真实数字和重新采样后的数字
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("从输入数据中选取")
ax[5, 5].set_title('从核密度模型中生成的"新"数字')

plt.show()

总结

在这个实验中,我们学习了如何使用核密度估计(Kernel Density Estimation,KDE)来生成数据的新样本。我们使用 scikit-learn 库来实现这项技术。我们通过网格搜索交叉验证优化了 KDE 的带宽参数。然后,我们对新的数据点进行采样,并使用主成分分析(PCA)将它们转换回原始维度。最后,我们将原始数字和重新采样后的数字并排绘制在一个 4x11 的网格中。