나는이 책을 가지고 있지 않으므로 Kruschke가 사용하는 스무딩 방법을 잘 모르겠지만 직관을 위해 0.1에서 1.0까지의 다양한 대역폭을 사용 하는 가우스 커널 밀도 추정치 와 함께 표준 법선의 100 샘플 샘플을 고려하십시오 . (Breefly, Gaussian 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))