Tôi không có cuốn sách này nên tôi không chắc Kruschke sử dụng phương pháp làm mịn nào, nhưng với trực giác, hãy xem xét lô 100 mẫu này từ một tiêu chuẩn thông thường, cùng với ước tính mật độ hạt nhân Gaussian sử dụng các băng thông khác nhau từ 0,1 đến 1,0. (Tóm lại, KDE Gaussian là một loại biểu đồ được làm mịn: Chúng ước tính mật độ bằng cách thêm Gaussian cho mỗi điểm dữ liệu, với giá trị trung bình tại giá trị quan sát được.)
Bạn có thể thấy rằng ngay cả khi làm mịn tạo ra phân phối không theo phương thức, chế độ thường nằm dưới giá trị đã biết là 0.
Hơn nữa, đây là một biểu đồ của chế độ ước tính (trục y) theo băng thông kernel được sử dụng để ước tính mật độ, sử dụng cùng một mẫu. Hy vọng rằng điều này cho thấy một số trực giác về cách ước tính thay đổi với các tham số làm mịn.
#!/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))