У меня нет книги под рукой, поэтому я не уверен, какой метод сглаживания использует Крушке, но для интуиции рассмотрим этот график из 100 выборок из стандартной нормали вместе с оценками плотности ядра по Гауссу с использованием различных полос пропускания от 0,1 до 1,0. (Вкратце, гауссовы 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))