はじめに
カーネル密度推定 (Kernel Density Estimation: KDE) は、非パラメトリックな密度推定手法です。この実験では、KDE を使って新しいデータサンプルを生成する方法を学びます。この手法を実装するために、scikit-learn ライブラリを使用します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題があった場合は、Labby にお尋ねください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データの読み込み
まず、scikit-learn から digits データセットを読み込みます。このデータセットには、0 から 9 までの数字の 8x8 画像が含まれています。データセットの次元を 15 に削減するために、主成分分析 (Principal Component Analysis: PCA) を使用します。
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 個の新しい点をサンプリングするために、最適な推定器を使用します。その後、PCA の逆変換を使用して、新しいデータを元の 64 次元に戻します。
## 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 のグリッドで横並びにプロットしました。