No tengo el libro a la mano, así que no estoy seguro de qué método de suavizado utiliza Kruschke, pero por intuición considere este gráfico de 100 muestras de una normal estándar, junto con las estimaciones de densidad de kernel gaussianas que utilizan varios anchos de banda de 0.1 a 1.0. (Brevemente, los KDE gaussianos son una especie de histograma suavizado: estiman la densidad agregando un gaussiano para cada punto de datos, con la media en el valor observado).
Puede ver que incluso una vez que el suavizado crea una distribución unimodal, el modo generalmente está por debajo del valor conocido de 0.
Más, aquí hay una gráfica del modo estimado (eje y) por ancho de banda del kernel utilizado para estimar la densidad, usando la misma muestra. Esperemos que esto preste algo de intuición sobre cómo varía la estimación con los parámetros de suavizado.
#!/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))