Elimdeki kitabım yok, bu yüzden Kruschke'nin hangi yumuşatma yöntemini kullandığından emin değilim, ancak sezgi için 0.1'den 1.0'a kadar çeşitli bant genişlikleri kullanılarak Gauss çekirdek yoğunluğu tahminleriyle birlikte standart bir normalden 100 numunenin bu grafiğini düşünün . (Kısaca, Gauss KDE'leri bir çeşit düzgünleştirilmiş histogramdır: Her bir veri noktası için bir Gauss ekleyerek, gözlemlenen değerde ortalama ile yoğunluğu tahmin ederler.)
Düzgünleştirmenin tek modlu bir dağıtım oluşturmasına rağmen, modun genellikle bilinen 0 değerinin altında olduğunu görebilirsiniz.
Dahası, burada aynı örneği kullanarak yoğunluğu tahmin etmek için kullanılan çekirdek bant genişliği ile tahmini modun (y ekseni) bir grafiği. Umarım bu, tahminin düzeltme parametreleriyle nasıl değiştiği hakkında bazı sezgiler sağlar.
#!/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))