2013-03-14 8 views
15

Voglio tracciare un'approssimazione della funzione di densità di probabilità basata su un campione che ho; La curva che simula il comportamento dell'istogramma. Posso avere campioni grandi quanto voglio.Funzione di densità di probabilità di plottaggio per campione con matplotlib

+0

Qual è il tuo campione? È una distribuzione, o dati reali? – askewchan

+1

Non capisco come si potrebbe votare questa domanda ?! Intendo in base a cosa ??? – Cupitor

+2

di solito su [SO] le persone fanno valere domande immediatamente chiare e mostrano anche alcuni tentativi da parte del richiedente di rispondere alla propria domanda. "Che cosa hai provato?" Di solito i downvotes sono accompagnati da commenti, quindi non sono sicuro del perché non sia successo in questo caso. – askewchan

risposta

25

Se si desidera tracciare una distribuzione, e tu lo sai, definirlo come una funzione, e tracciare come così:

import numpy as np 
from matplotlib import pyplot as plt 

def my_dist(x): 
    return np.exp(-x ** 2) 

x = np.arange(-100, 100) 
p = my_dist(x) 
plt.plot(x, p) 
plt.show() 

Se non avete l'esatta distribuzione come funzione analitica, forse è possibile generare un ampio campione, prendere un istogramma e in qualche modo lisciare i dati:

import numpy as np 
from scipy.interpolate import UnivariateSpline 
from matplotlib import pyplot as plt 

N = 1000 
n = N//10 
s = np.random.normal(size=N) # generate your data sample with N elements 
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins 
x = x[:-1] + (x[1] - x[0])/2 # convert bin edges to centers 
f = UnivariateSpline(x, p, s=n) 
plt.plot(x, f(x)) 
plt.show() 

È possibile aumentare o diminuire s (fattore di smoothing) all'interno del UnivariateSpline f chiamata per aumentare o diminuire il livellamento. Ad esempio, utilizzando i due ottieni: dist to func

+0

che non aiuta nel mio caso. Ho già scritto la mia funzione di campionamento e non è esatta per i campioni di dimensioni che si possono dire! – Cupitor

+0

Quindi penso che dovresti modificare la tua domanda per essere più chiara. Questo risponde alla tua domanda assumendo che tu "abbia la distribuzione". – askewchan

+0

Grazie. Ma ottengo il seguente errore: innalza ValueError ("gli array xey devono avere lunghezza uguale" ValueError: gli array xey devono essere uguali in lunghezza lungo l'asse di interpolazione – Cupitor

18

Quello che devi fare è usare gaussian_kde dal pacchetto scipy.stats.kde.

dato i dati si può fare qualcosa di simile:

from scipy.stats.kde import gaussian_kde 
from numpy import linspace 
# create fake data 
data = randn(1000) 
# this create the kernel, given an array it will estimate the probability over that values 
kde = gaussian_kde(data) 
# these are the values over wich your kernel will be evaluated 
dist_space = linspace(min(data), max(data), 100) 
# plot the results 
plt.plot(dist_space, kde(dist_space)) 

La densità del kernel può essere configurato a piacimento e in grado di gestire i dati N-dimensionali con facilità. Eviterà anche la distorsione spline che puoi vedere nella trama data da askewchan.

enter image description here

+0

Sto cercando una soluzione simile. Ho già un set di dati, ma non so quale distribuzione abbia, quindi sto cercando di tracciare una funzione di distribuzione di probabilità usando python e non capisco come tracciarlo. Qualsiasi aiuto è apprezzato in quel caso. –

+1

@SitzBlogz Supponiamo che il tuo set di dati sia chiamato 'data', quindi rimuovi la riga' data = randn (1000) 'nella risposta @EnricoGiampieri e il gioco è fatto! –