ฉันไม่ได้มีหนังสือที่อยู่ในมือดังนั้นฉันไม่แน่ใจว่าวิธีการปรับให้เรียบใช้ Kruschke แต่สำหรับสัญชาตญาณพิจารณาพล็อต 100 ตัวอย่างนี้จากมาตรฐานปกติพร้อมกับเกาส์เคอร์เนลประมาณการความหนาแน่นของการใช้แบนด์วิดท์ต่างๆ 0.1-1.0 (สั้น ๆ KDE ของเกาส์เซียนเป็นฮิสโตแกรมที่ราบรื่น: พวกมันประมาณความหนาแน่นโดยการเพิ่ม Gaussian สำหรับแต่ละจุดข้อมูลด้วยค่าเฉลี่ยที่ค่าที่สังเกต)
คุณจะเห็นได้ว่าแม้เมื่อการปรับให้เรียบสร้างการกระจายแบบ unimodal ได้โหมดโดยทั่วไปจะต่ำกว่าค่าที่ทราบเป็น 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))