Применение функций scipy.ndimage .filters.gaussian_filter и scipy.stats.gaussian_kde по заданному набору данных может дать очень похожие результаты, если параметры sigma
и bw_method
в каждой функции соответственно выбраны адекватно.
Например, я могу получить для случайного 2D-распределения точек следующие графики, установив sigma=2.
в gaussian_filter
(левый график) и bw_method=sigma/30.
в gaussian_kde
(правый график):
(MWE находится в нижней части вопроса)
Очевидно, что между этими параметрами существует связь, поскольку один из них применяет к данным фильтр Гаусса, а другой — оценщик плотности ядра Гаусса.
Определение каждого параметра:
сигма : скаляр или последовательность скаляров Стандартное отклонение для ядра Гаусса. Стандартные отклонения фильтра Гаусса задаются для каждой оси в виде последовательности или в виде одного числа, и в этом случае оно одинаково для всех осей.
Это я могу понять, учитывая определение оператора Гаусса:
- scipy.stats.gaussian_kde,
bw_method
:
bw_method : str, скалярный или вызываемый, необязательный. Метод, используемый для вычисления пропускной способности оценщика. Это может быть «scott», «silverman», скалярная константа или callable. Если это скаляр, то он будет использоваться непосредственно как kde.factor. Если это вызываемый объект, он должен принимать экземпляр gaussian_kde в качестве единственного параметра и возвращать скаляр. Если None (по умолчанию), используется «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
, стандартное отклонение для ядра Гаусса. - person Hugues Fontenelle   schedule 24.09.2014