Applicando le funzioni scipy.ndimage.filters.gaussian_filter e scipy.stats.gaussian_kde oltre un dato insieme di dati può dare risultati molto simili, se le sigma
e bw_method
parametri di ciascuna funzione rispettivamente vengono scelti adeguatamente.Relazione tra sigma e la larghezza di banda in gaussian_filter e gaussian_kde
Per esempio, posso ottenere per una distribuzione casuale 2D dei punti seguenti trame impostando sigma=2.
nel (grafico a sinistra) gaussian_filter
e bw_method=sigma/30.
nel (grafico a destra) gaussian_kde
:
(Il MWE è in fondo alla domanda)
Esiste ovviamente una relazione tra questi parametri poiché si applica un filtro gaussiano e l'altro uno stimatore di densità del kernel gaussiano sui dati.
La definizione di ciascun parametro è:
sigma: scalare o sequenza di scalari deviazione standard per gaussiana kernel. Le deviazioni standard del filtro gaussiano sono date per per asse come sequenza o come numero singolo, nel qual caso è uguale a per tutti gli assi.
Questo posso capire data la definizione di operatore gaussiano:
- scipy.stats.gaussian_kde,
bw_method
:
bw_method: str, scalare o callable, opzionale Il metodo utilizzato per calcola lo stimatore larghezza di banda. Può essere 'scott', 'silverman', una costante scalare o un callable. Se uno scalare, questo sarà usato direttamente come kde.factor. Se è un callable, dovrebbe prendere un'istanza gaussian_kde come parametro solo e restituire uno scalare. Se None (valore predefinito), 'scott' è utilizzato. Vedi Note per maggiori dettagli.
In questo caso supponiamo l'ingresso per bw_method
è uno scalare (float) in modo da essere comparabile con sigma
. Ecco dove mi perdo dal momento che non riesco a trovare informazioni su questo parametro kde.factor
ovunque.
Quello che vorrei sapere è il precisa equazione matematica che collega entrambi questi parametri (es: sigma
e bw_method
quando si utilizza un galleggiante), se possibile.
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' non prende' bw' come input ma 'sigma', la deviazione standard per il kernel gaussiano. –