Zastosowanie funkcji scipy.ndimage.filters.gaussian_filter i scipy.stats.gaussian_kde ciągu danego zestawu danych może dawać bardzo podobne wyniki, jeśli parametry w poszczególnych funkcji sigma
bw_method
i odpowiednio dobiera się odpowiednio.Zależność sigma i szerokość pasma w gaussian_filter i gaussian_kde
Na przykład, można uzyskać dla losowego rozkładu 2D punktów następujących działek ustawiając sigma=2.
w gaussian_filter
(lewy działki) i bw_method=sigma/30.
w gaussian_kde
(prawy wykres):
(MWE jest na dole pytania)
Istnieje oczywiście związek między tymi parametrami, ponieważ jeden stosuje filtr Gaussa, a drugi Gaussian Grain Estymator Geny na danych.
Definicję każdego parametru:
Sigma: skalar lub sekwencję skalarnych standardowego odchylenia gaussowskiego jądra. Standardowe odchylenia filtru gaussowskiego są podane dla każdej osi jako sekwencji lub jako pojedyncza liczba, w takim przypadku jest ona równa dla wszystkich osi.
Ten można zrozumieć biorąc pod definicję operatora Gaussa:
- scipy.stats.gaussian_kde,
bw_method
:
bw_method: str, skalar lub wypowiedzenia, opcjonalnie Metoda zastosowana do obliczenia estymatora: pasmo. Może to być stała skalarna "scott", "silverman", lub wywoływalna. Jeśli skalar będzie użyty bezpośrednio jako parametr kde.factor, będzie on używany jako . Jeśli jest wywoływalna, powinna przyjmować instancję gaussian_kde jako jedyny parametr i zwracać wartość skalarną. Jeśli brak (wartość domyślna), używany jest kod "scott": . Aby uzyskać więcej informacji, zobacz Uwagi.
W tym przypadku załóżmy, wejście dla bw_method
jest skalarne (float), tak aby być porównywalne z sigma
. Oto, gdzie się zagubię, ponieważ nie mogę znaleźć nigdzie informacji o tym parametrze kde.factor
.
Co chciałbym wiedzieć, jest precyzyjne równanie matematyczne który łączy oba te parametry (tzn sigma
i bw_method
gdy stosuje się float), jeśli to możliwe.
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' nie bierze' bw' jako wejście, ale 'sigma', odchylenie standardowe dla jądra Gaussa. –