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
Antwort
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:
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
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
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
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.
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. –
@SitzBlogz Angenommen, Ihr Datensatz heißt 'data', dann entfernen Sie einfach die Zeile' data = randn (1000) 'in @ EnricoGiampieri und Sie sind fertig! –
Was ist Ihre Probe? Ist es eine Verteilung oder tatsächliche Daten? – askewchan
Ich verstehe nicht, wie jemand diese Frage abstimmen könnte ?! Ich meine basierend auf was ??? – Cupitor
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