2015-02-17 15 views
5

Szukałem w Internecie i jeszcze się znaleźć odpowiedź lub sposób, aby dowiedzieć następująceMATLAB ksdensity odpowiednik w Pythonie

mam tłumaczenia kodu MATLAB do Pythona, gdzie w MATLAB im chce znaleźć oszacowanie gęstości jądra z funkcją:

[p,x] = ksdensity(data) 

gdzie p jest prawdopodobieństwem w punkcie x rozkładu.

Scipy ma funkcję, ale zwraca tylko p.

Czy istnieje sposób na znalezienie prawdopodobieństwa dla wartości x?

Dzięki!

Odpowiedz

4

That formę ksdensity połączenie automatycznie generuje arbitralną x. scipy.stats.gaussian_kde() zwraca funkcję wywoływalną, którą można ocenić dowolnym wybranym x. Odpowiednikiem x będzie np.linspace(data.min(), data.max(), 100).

import numpy as np 
from scipy import stats 

data = ... 
kde = stats.gaussian_kde(data) 
x = np.linspace(data.min(), data.max(), 100) 
p = kde(x) 
+0

Tylko na podręczne, próbowałem zarówno 'scipy.stats.gaussian_kde()' i 'sklearn.neighbors.KernelDensity', pierwszy mam' dead' jądra, a drugi działa. – cqcn1991

4

Inną opcją jest estymator gęstości jądra w scikit-learn pakietu Python, sklearn.neighbors.KernelDensity

Oto mały przykład podobny do dokumentacji Matlab dla ksdensity o rozkładzie Gaussa:

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.neighbors import KernelDensity 

np.random.seed(12345) 
# similar to MATLAB ksdensity example x = [randn(30,1); 5+randn(30,1)]; 
Vecvalues=np.concatenate((np.random.normal(0,1,30), np.random.normal(5,1,30)))[:,None] 
Vecpoints=np.linspace(-8,12,100)[:,None] 
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(Vecvalues) 
logkde = kde.score_samples(Vecpoints) 
plt.plot(Vecpoints,np.exp(logkde)) 
plt.show() 

działki to daje wygląda następująco:

enter image description here

Powiązane problemy