Ich habe das Buch nicht zur Hand, daher bin ich mir nicht sicher, welche Glättungsmethode Kruschke verwendet, aber für die Intuition betrachten Sie diese Darstellung von 100 Proben aus einer Standardnormalen zusammen mit Schätzungen der Gaußschen Kerneldichte unter Verwendung verschiedener Bandbreiten von 0,1 bis 1,0. (Kurz gesagt, Gaußsche KDEs sind eine Art geglättetes Histogramm: Sie schätzen die Dichte, indem sie für jeden Datenpunkt einen Gaußschen Wert addieren, dessen Mittelwert beim beobachteten Wert liegt.)
Sie können sehen, dass der Modus im Allgemeinen unter dem bekannten Wert von 0 liegt, selbst wenn durch das Glätten eine unimodale Verteilung erstellt wird.
Weiter ist hier eine grafische Darstellung des geschätzten Modus (y-Achse) nach Kernbandbreite, der zum Schätzen der Dichte unter Verwendung derselben Stichprobe verwendet wird. Hoffentlich gibt dies einen Anhaltspunkt dafür, wie sich die Schätzung mit den Glättungsparametern ändert.
#!/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))