Связь между сигмой и пропускной способностью в gaussian_filter и gaussian_kde

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

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

введите здесь описание изображения

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

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

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

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

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

введите здесь описание изображения

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()

person Gabriel    schedule 09.09.2014    source источник
comment
scipy.ndimage.filters.gaussian_filter принимает не bw в качестве входных данных, а sigma, стандартное отклонение для ядра Гаусса.   -  person Hugues Fontenelle    schedule 24.09.2014


Ответы (1)


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

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

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

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

Вы можете прочитать об оценке плотности ядра.

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

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

person Hugues Fontenelle    schedule 24.09.2014
comment
Я не совсем уверен, что понимаю, почему нет никаких отношений, и было бы здорово, если бы вы могли немного рассказать об этом, но если это единственный ответ, который я получу, я награжу вас 50 баллов все же. Спасибо Хьюз! - person Gabriel; 24.09.2014
comment
Я расширил свой ответ. Нет связи между фильтрацией и оценкой. Однако вы можете связать std. разв. к пропускной способности оценщика. - person Hugues Fontenelle; 24.09.2014