2014-09-09 9 views
6

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 sigmabw_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):

enter image description here

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

enter image description here

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

'scipy.ndimage.filters.gaussian_filter' nie bierze' bw' jako wejście, ale 'sigma', odchylenie standardowe dla jądra Gaussa. –

Odpowiedz

3

nie ma żadnego związku, bo robisz dwie różne rzeczy.

Z plikiem scipy.ndimage.filters.gaussian_filter filtrujesz zmienną 2D (obraz) za pomocą jądra, a jądro to gaussia. Zasadniczo wygładza obraz.

Z scipy.stats.gaussian_kde próby oszacowania funkcji gęstości prawdopodobieństwa swojego 2D-zmiennej. Parametr przepustowości (lub wygładzania) jest twoim krokiem integracyjnym i powinien być tak mały, jak pozwalają na to dane.

dwa obrazy wyglądają tak samo, ponieważ równomierny rozkład, z którego wyciągnął próbek, nie jest to, że różni się od rozkładu normalnego. Oczywiście uzyskasz lepszą ocenę za pomocą normalnej funkcji jądra.

Można przeczytać o Kernel density estimation.

Edit: Kernel Density Estimation (KDE), jądra są skalowane tak, że przepustowość jest odchylenie standardowe jądro wygładzającym. Która przepustowość do użycia nie jest oczywista, ponieważ zależy od danych. Istnieje optymalny wybór dla danych jednowymiarowych, nazywanych zasadą Silvermana.

Podsumowując, nie ma żadnego związku między odchyleniem standardowym filtrem Gaussa i szerokości pasma KDE, bo mówimy pomarańcze i jabłka. Jednak mówienie o KDE tylko, to jest zależność między przepustowością KDE a standardowym odchyleniem tego samego jądra KDE. Są równi! W rzeczywistości szczegóły implementacji są różne i może istnieć skalowanie zależne od rozmiaru jądra. Można odczytać konkretny pakiet gaussian_kde.py

+0

Nie jestem do końca pewien, że rozumiem, że nie ma związku i byłoby wspaniale, gdyby można było coś na to poruszyć, ale jeśli jest to jedyna odpowiedź, którą otrzymam, przyznam ci 50 punktów. Dzięki Hughes! – Gabriel

+0

Rozszerzyłem moją odpowiedź. Brak związku między filtrowaniem a szacowaniem. Jednak możesz odnieść std. dev. do pasma estymatora. –

Powiązane problemy