2014-09-09 8 views
6

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:

enter image description here

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

enter image description here

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

'scipy.ndimage.filters.gaussian_filter' non prende' bw' come input ma 'sigma', la deviazione standard per il kernel gaussiano. –

risposta

3

Non v'è alcun rapporto, perché si sta facendo due cose diverse.

Con scipy.ndimage.filters.gaussian_filter, si filtra una variabile 2D (un'immagine) con un kernel e il kernel risulta essere gaussiano. Sta essenzialmente uniformando l'immagine.

Con scipy.stats.gaussian_kde si tenta di stimare la funzione di densità di probabilità della variabile 2D. La larghezza di banda (o il parametro smoothing) è il tuo passo di integrazione e dovrebbe essere piccolo come consentito dai dati.

Le due immagini hanno lo stesso aspetto perché la distribuzione uniforme, da cui sono stati disegnati i campioni, non è diversa da una distribuzione normale. Ovviamente otterresti una stima migliore con una normale funzione del kernel.

È possibile leggere circa Kernel density estimation.

Edit: In Kernel Density Estimation (KDE), i noccioli vengono scalati in modo tale che la larghezza di banda è la deviazione standard del kernel smoothing. Quale larghezza di banda usare non è ovvia poiché dipende dai dati. Esiste una scelta ottimale per dati univariati, chiamata la regola empirica di Silverman.

Per riassumere, non esiste alcuna relazione tra la deviazione standard di un filtro gaussiano e la larghezza di banda di un KDE, perché stiamo parlando di arance e mele. Tuttavia, parlando di KDE solo, lì è una relazione tra la larghezza di banda KDE e la deviazione standard dello stesso kernel di KDE. Sono uguali! In verità i dettagli di implementazione sono diversi e potrebbe esserci un ridimensionamento che dipende dalla dimensione del kernel. Puoi leggere il tuo pacchetto specifico gaussian_kde.py

+0

Non sono abbastanza sicuro di capire perché non ci sia alcuna relazione e sarebbe bello se potessi espanderci un po 'su questo, ma se questa è l'unica risposta che ottengo, ti assegnerò comunque i 50 punti. Grazie Hughes! – Gabriel

+0

Ho ampliato la mia risposta. Nessuna relazione tra filtraggio e stima. Comunque puoi mettere in relazione lo std. dev. al bandwdith dello stimatore. –

Problemi correlati