2014-09-09 3 views
6

Применение функции scipy.ndimage.filters.gaussian_filter и scipy.stats.gaussian_kde более заданного набора данных может дать очень похожие результаты, если sigma и bw_method параметров в каждой функции соответственно выбраны надлежащим образом.Связь между сигма и полосой пропускания в gaussian_filter и gaussian_kde

Например, можно получить для случайного распределения 2D точек следующие участки путем установки sigma=2. в gaussian_filter (левый график) и bw_method=sigma/30. в gaussian_kde (правый график):

enter image description here

(MWE находится в нижней части вопроса)

Существует очевидная связь между этими параметрами, так как применяется гауссовский фильтр, а другой - гауссовский коэффициент плотности ядра по данным.

Определение каждого параметра:

сигма: скаляр или последовательность скаляров Стандартное отклонение для гауссова ядра. Стандартные отклонения фильтра Гаусса даны для каждой оси в виде последовательности или в виде единственного числа, и в этом случае оно равно , равному для всех осей.

Это один я могу понять, учитывая определение гауссовой оператора:

enter image description here

bw_method: ул скаляр или отозваны, Необязательный Метод, используемый для , вычисляет оценку пропускная способность. Это может быть «scott», «silverman», скалярная константа или вызываемая. Если скаляр, это будет использоваться непосредственно как kde.factor. Если вызываемый, он должен взять экземпляр gaussian_kde как только параметр и вернуть скаляр. Если «Нет» (по умолчанию), «scott» - . См. Примечания для более подробной информации.

В этом случае предположим, что вход для bw_method является скаляр (с плавающей точкой) таким образом, чтобы быть сравнима с sigma. Вот где я заблудился, так как я не могу найти никакой информации об этом параметре kde.factor в любом месте.

То, что я хотел бы знать, является точного математического уравнения, который соединяет оба этих параметры (например: sigma и bw_method при использовании с плавающей точкой), если это возможно.


MWE:

import numpy as np 
from scipy.stats import gaussian_kde 
from scipy.ndimage.filters import gaussian_filter 
import matplotlib.pyplot as plt 

def rand_data(): 
    return np.random.uniform(low=1., high=200., size=(1000,)) 

# Generate 2D data. 
x_data, y_data = rand_data(), rand_data() 
xmin, xmax = min(x_data), max(x_data) 
ymin, ymax = min(y_data), max(y_data) 

# Define grid density. 
gd = 100 
# Define bandwidth 
bw = 2. 

# Using gaussian_filter 
# Obtain 2D histogram. 
rang = [[xmin, xmax], [ymin, ymax]] 
binsxy = [gd, gd] 
hist1, xedges, yedges = np.histogram2d(x_data, y_data, range=rang, bins=binsxy) 
# Gaussian filtered histogram. 
h_g = gaussian_filter(hist1, bw) 

# Using gaussian_kde 
values = np.vstack([x_data, y_data]) 
# Data 2D kernel density estimate. 
kernel = gaussian_kde(values, bw_method=bw/30.) 
# Define x,y grid. 
gd_c = complex(0, gd) 
x, y = np.mgrid[xmin:xmax:gd_c, ymin:ymax:gd_c] 
positions = np.vstack([x.ravel(), y.ravel()]) 
# Evaluate KDE. 
z = kernel(positions) 
# Re-shape for plotting 
z = z.reshape(gd, gd) 

# Make plots. 
fig, (ax1, ax2) = plt.subplots(1, 2) 
# Gaussian filtered 2D histograms. 
ax1.imshow(h_g.transpose(), origin='lower') 
ax2.imshow(z.transpose(), origin='lower') 

plt.show() 
+0

'scipy.ndimage.filters.gaussian_filter' не принимает' bw' в качестве входных данных, а 'sigma', стандартное отклонение для гауссовского ядра. –

ответ

3

Там нет отношений, потому что вы делаете две разные вещи.

С scipy.ndimage.filters.gaussian_filter вы фильтруете 2D-переменную (изображение) с ядром, и это ядро ​​оказывается гауссовым. Это, по сути, сглаживание изображения.

С scipy.stats.gaussian_kde вы пытаетесь оценить функцию плотности вероятности вашей 2D-переменной. Полоса пропускания (или параметр сглаживания) является вашим шагом интеграции и должна быть такой же малой, как позволяют данные.

Два изображения выглядят одинаково, потому что ваше равномерное распределение, из которого вы нарисовали образцы, не отличается от обычного распределения. Очевидно, что вы получите лучшую оценку с нормальной функцией ядра.

Вы можете прочитать о Kernel density estimation.

Редактировать: в ядре оценивании плотности (KDE), ядра масштабируются таким образом, что ширина полосы пропускания представляет собой стандартное отклонение ядра сглаживания. Какая пропускная способность для использования не очевидна, так как она зависит от данных. Существует оптимальный выбор для одномерных данных, называемый правилом Сильвермана.

Подводя итог, нет никакой связи между стандартным отклонением гауссовского фильтра и пропускной способностью KDE, потому что мы говорим о апельсинах и яблоках. Тем не менее, говоря о KDE только, там - связь между шириной KDE и стандартным отклонением одного и того же ядра KDE. Они равны! На самом деле детали реализации различаются, и может быть масштабирование, зависящее от размера ядра. Вы можете прочитать свой конкретный пакет gaussian_kde.py

+0

Я не совсем уверен, что понимаю, почему у меня нет отношений, и было бы здорово, если бы вы могли немного расшириться, но если это единственный ответ, я получаю 50 очков. Спасибо Хьюз! – Gabriel

+0

Я расширил свой ответ. Никакой связи между фильтрацией и оценкой. Однако вы можете связать std. девиация к бандату оценки. –

 Смежные вопросы

  • Нет связанных вопросов^_^