Saya tidak memiliki buku yang ada di tangan jadi saya tidak yakin apa metode penghalusan yang digunakan Kruschke, tetapi untuk intuisi, pertimbangkan plot 100 sampel ini dari standar normal, bersama dengan perkiraan kepadatan kernel Gaussian menggunakan berbagai bandwidth dari 0,1 ke 1,0. (Secara singkat, KDE Gaussian adalah semacam histogram yang dihaluskan: Mereka memperkirakan kepadatan dengan menambahkan Gaussian untuk setiap titik data, dengan rata-rata pada nilai yang diamati.)
Anda dapat melihat bahwa bahkan setelah penghalusan menghasilkan distribusi unimodal, mode umumnya di bawah nilai 0 yang diketahui.
Terlebih lagi, inilah plot dari mode yang diperkirakan (sumbu-y) oleh bandwidth kernel yang digunakan untuk memperkirakan kepadatan, menggunakan sampel yang sama. Semoga ini memberikan beberapa intuisi tentang bagaimana estimasi bervariasi dengan parameter 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))