Връзка между сигма и честотна лента в 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 е в долната част на въпроса)

Очевидно има връзка между тези параметри, тъй като единият прилага Gaussian филтър, а другият Gaussian Kernel Density Estimator върху данните.

Дефиницията на всеки параметър е:

сигма : скалар или последователност от скалари Стандартно отклонение за гаусово ядро. Стандартните отклонения на филтъра на Гаус са дадени за всяка ос като последователност или като едно число, в който случай то е еднакво за всички оси.

Това мога да разбера, като се има предвид дефиницията на оператора на Гаус:

въведете описание на изображението тук

bw_method : str, скаларен или извикваем, незадължителен Методът, използван за изчисляване на честотната лента на оценителя. Това може да бъде „scott“, „silverman“, скаларна константа или извикваем. Ако е скаларен, това ще се използва директно като kde.factor. Ако може да бъде извикан, той трябва да приеме екземпляр на gaussian_kde като единствен параметър и да върне скалар. Ако няма (по подразбиране), се използва „scott“. Вижте Бележки за повече подробности.

В този случай нека приемем, че входът за bw_method е скалар (float), така че да бъде сравним с 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