Je n'ai pas le livre à portée de main, donc je ne sais pas quelle méthode de lissage Kruschke utilise, mais pour l'intuition, considérez ce tracé de 100 échantillons à partir d'une normale standard, ainsi que les estimations de la densité du noyau gaussien en utilisant différentes bandes passantes de 0,1 à 1,0. (En bref, les KDE gaussiens sont une sorte d'histogramme lissé: ils estiment la densité en ajoutant un gaussien pour chaque point de données, avec une moyenne à la valeur observée.)
Vous pouvez voir que même une fois que le lissage crée une distribution unimodale, le mode est généralement inférieur à la valeur connue de 0.
De plus, voici un tracé du mode estimé (axe y) par la bande passante du noyau utilisée pour estimer la densité, en utilisant le même échantillon. Espérons que cela donne une idée de la façon dont l'estimation varie en fonction des paramètres de lissage.
#!/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))