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
risposta
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:
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
Quindi penso che dovresti modificare la tua domanda per essere più chiara. Questo risponde alla tua domanda assumendo che tu "abbia la distribuzione". – askewchan
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
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.
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. –
@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! –
Qual è il tuo campione? È una distribuzione, o dati reali? – askewchan
Non capisco come si potrebbe votare questa domanda ?! Intendo in base a cosa ??? – Cupitor
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