У мене немає книги під рукою, тому я не впевнений, який метод згладжування використовує Крушке, але для інтуїції розглянемо цей сюжет із 100 зразків від стандартного нормального, а також оцінки щільності ядра Гаусса, використовуючи різні пропускну здатність від 0,1 до 1,0. (Коротко кажучи, гауссові KDE - це свого роду згладжена гістограма. Вони оцінюють щільність, додаючи гауссова для кожної точки даних із середнім значенням у спостережуваному значенні.)
Видно, що навіть раз згладжування створює одномодальний розподіл, режим, як правило, нижче відомого значення 0.
Більше, ось графік розрахункового режиму (вісь y) за пропускною здатністю ядра, який використовується для оцінки щільності, використовуючи той самий зразок. Сподіваємось, це надає деякої інтуїції, як оцінка змінюється залежно від параметрів вирівнювання.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 1 09:35:51 2017
@author: seaneaster
"""
import numpy as np
from matplotlib import pylab as plt
from sklearn.neighbors import KernelDensity
REAL_MODE = 0
np.random.seed(123)
def estimate_mode(X, bandwidth = 0.75):
kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
u = np.linspace(-3,3,num=1000)[:, np.newaxis]
log_density = kde.score_samples(u)
return u[np.argmax(log_density)]
X = np.random.normal(REAL_MODE, size = 100)[:, np.newaxis] # keeping to standard normal
bandwidths = np.linspace(0.1, 1., num = 8)
plt.figure(0)
plt.hist(X, bins = 100, normed = True, alpha = 0.25)
for bandwidth in bandwidths:
kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
u = np.linspace(-3,3,num=1000)[:, np.newaxis]
log_density = kde.score_samples(u)
plt.plot(u, np.exp(log_density))
bandwidths = np.linspace(0.1, 3., num = 100)
modes = [estimate_mode(X, bandwidth) for bandwidth in bandwidths]
plt.figure(1)
plt.plot(bandwidths, np.array(modes))