2013-03-14 8 views
15

Ich möchte eine Näherung der Wahrscheinlichkeitsdichtefunktion basierend auf eine Probe, die ich habe, plotten; Die Kurve, die das Histogrammverhalten nachahmt. Ich kann haben Proben so groß wie ich will.Plotten Wahrscheinlichkeitsdichtefunktion durch Probe mit Matplotlib

+0

Was ist Ihre Probe? Ist es eine Verteilung oder tatsächliche Daten? – askewchan

+1

Ich verstehe nicht, wie jemand diese Frage abstimmen könnte ?! Ich meine basierend auf was ??? – Cupitor

+2

normalerweise auf [SO] Leute werden Fragen aufwerfen, die sofort klar sind und auch einige Versuche des Fragestellers zeigen, ihre eigene Frage zu beantworten. "Was hast du probiert?" Normalerweise werden Downvotes jedoch von Kommentaren begleitet, weshalb ich mir nicht sicher bin, warum das in diesem Fall nicht passiert ist. – askewchan

Antwort

25

Wenn Sie eine Verteilung darstellen möchten, und Sie wissen es, definieren sie als eine Funktion, und plotten es als so:

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

Wenn Sie nicht über die genaue Verteilung als eine haben analytische Funktion, vielleicht können Sie eine große Probe, nehmen Sie ein Histogramm erzeugen und irgendwie die Daten glätten:

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

Sie können s (Glättungsfaktor) innerhalb der UnivariateSpline f erhöhen oder verringern Aufruf der Funktion, um die Glättung zu erhöhen oder zu verringern. Zum Beispiel, mit den beiden erhalten Sie: dist to func

+0

das hilft in meinem Fall nicht. Ich habe bereits meine Sampling-Funktion geschrieben und es ist nicht genau für Samples der Größe eins, sagen wir mal! – Cupitor

+0

Dann denke ich, du solltest deine Frage bearbeiten, um klarer zu sein. Dies beantwortet Ihre Frage unter der Annahme, dass Sie "die Distribution haben". – askewchan

+0

Danke. Aber ich bekomme folgende Fehlermeldung: raise ValueError ("x- und y-arrays müssen gleich lang sein" ValueError: x- und y-arrays müssen entlang der Interpolationsachse gleich lang sein. – Cupitor

18

Was Sie tun müssen, ist die Gaussian_kde aus dem scipy.stats.kde Paket zu verwenden.

Ihre Daten gegeben du so etwas tun kann:

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

Die Kernel-Dichte nach Belieben konfiguriert werden kann und N-dimensionalen Daten mit Leichtigkeit. Es vermeidet auch die Spline-Verzerrung, die Sie in der von askewchan gegebenen Darstellung sehen können.

enter image description here

+0

Ich suche eine ähnliche Lösung. Ich habe einen Datensatz bereits, aber ich weiß nicht, welche Verteilung es hat, also versuche ich, eine Wahrscheinlichkeitsverteilungsfunktion mit Python zu plotten, und ich weiß nicht, wie man das plottet. Jede Hilfe wird in diesem Fall geschätzt. –

+1

@SitzBlogz Angenommen, Ihr Datensatz heißt 'data', dann entfernen Sie einfach die Zeile' data = randn (1000) 'in @ EnricoGiampieri und Sie sind fertig! –