2015-02-17 20 views
5

ho guardato on-line e non hanno ancora trovato una risposta o un modo per capire il seguenteMATLAB ksdensity equivalente in Python

sto traducendo un certo codice MATLAB per Python dove in MATLAB im cercando di trovare la stima della densità del kernel con la funzione:

[p,x] = ksdensity(data) 

dove p è la probabilità a punto x nella distribuzione.

Scipy ha una funzione ma restituisce solo p.

C'è un modo per trovare la probabilità ai valori di x?

Grazie!

risposta

4

Quella forma delLa chiamatagenera automaticamente un arbitrario x. scipy.stats.gaussian_kde() restituisce una funzione callable che può essere valutata con qualsiasi x di propria scelta. L'equivalente x sarebbe 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

Solo per un rapido riferimento, ho provato entrambi i 'scipy.stats.gaussian_kde()' e 'sklearn.neighbors.KernelDensity', la prima ho ottenuto' dead' kernel, e le opere seconde. – cqcn1991

4

Un'altra opzione è lo stimatore densità di kernel nella-Learn Scikit package Python, sklearn.neighbors.KernelDensity

Ecco un piccolo esempio simile alla documentazione Matlab per ksdensity per una distribuzione gaussiana:

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

La trama questo produce assomiglia:

enter image description here