核密度估計?

本案例說明如何使用核密度估計(KDE)(一種強大的非參數密度估計技術)來學習數據集的生成模型。有了這個生成模型,就可以繪制新樣本。 這些新樣本反映了數據的基礎模型。

輸出:

best bandwidth: 3.79269019073225

(譯者注:輸出中的英文為打印內容,是由代碼中打印的英文所致,故不進行翻譯)

輸入:

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import load_digits
from sklearn.neighbors import KernelDensity
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV

# 加載數據
digits = load_digits()

# 將64維數據投影到較低維
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

# 使用網格搜索交叉驗證來優化帶寬
params = {'bandwidth': np.logspace(-1120)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

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

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

# 從數據中抽樣44個點
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

# 把數據變換為4*11結構的網格
new_data = new_data.reshape((411-1))
real_data = digits.data[:44].reshape((411-1))

# 繪制真實的手寫數字數據集以及抽樣出的44個數字的數據集
fig, ax = plt.subplots(911, 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((88)),
                             cmap=plt.cm.binary, interpolation='nearest')
        im.set_clim(016)
        im = ax[i + 5, j].imshow(new_data[i, j].reshape((88)),
                                 cmap=plt.cm.binary, interpolation='nearest')
        im.set_clim(016)

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

plt.show()

腳本的總運行時間:(0分鐘5.437秒)