本が手元にないので、Kruschkeがどのスムージング方法を使用するかわかりませんが、直観のために、0.1から1.0までのさまざまな帯域幅を使用したガウスカーネル密度推定とともに、標準法線からの100サンプルのこのプロットを考慮してください。(簡単に言えば、ガウスKDEは一種の平滑化されたヒストグラムです。各データポイントにガウスを追加することで密度を推定します。平均値は観測値です。)
平滑化が単峰性分布を作成した後でも、モードは一般に既知の値である0未満であることがわかります。
さらに、同じサンプルを使用して、密度の推定に使用されるカーネル帯域幅ごとの推定モード(y軸)のプロットがあります。これが、推定値が平滑化パラメーターによってどのように変化するかについての直観に役立つことを願っています。
#!/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))