Non ho il libro a portata di mano, quindi non sono sicuro del metodo di smoothing utilizzato da Kruschke, ma per intuizione considerare questa trama di 100 campioni da uno standard normale, insieme alle stime della densità del kernel gaussiano usando varie larghezze di banda da 0,1 a 1,0. (In breve, i KDE gaussiani sono una sorta di istogramma levigato: stimano la densità aggiungendo un gaussiano per ciascun punto di dati, con media al valore osservato.)
Puoi vedere che anche una volta che il livellamento crea una distribuzione unimodale, la modalità è generalmente inferiore al valore noto di 0.
Inoltre, ecco un grafico della modalità stimata (asse y) della larghezza di banda del kernel utilizzata per stimare la densità, usando lo stesso campione. Speriamo che questo dia qualche intuizione su come varia la stima con i parametri di smoothing.
#!/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))