Применение функции 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
(правый график):
(MWE находится в нижней части вопроса)
Существует очевидная связь между этими параметрами, так как применяется гауссовский фильтр, а другой - гауссовский коэффициент плотности ядра по данным.
Определение каждого параметра:
сигма: скаляр или последовательность скаляров Стандартное отклонение для гауссова ядра. Стандартные отклонения фильтра Гаусса даны для каждой оси в виде последовательности или в виде единственного числа, и в этом случае оно равно , равному для всех осей.
Это один я могу понять, учитывая определение гауссовой оператора:
- scipy.stats.gaussian_kde,
bw_method
:
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()
'scipy.ndimage.filters.gaussian_filter' не принимает' bw' в качестве входных данных, а 'sigma', стандартное отклонение для гауссовского ядра. –