Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an
- Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an
- Binned-Least-Squares-Methode zur Anpassung der Poisson-Verteilung in Python
- Verwenden Sie ein negatives Binomial, um die Poisson-Verteilung über einen übermäßig verteilten Datensatz anzupassen
- Poisson-Verteilung für stark gestreute Daten mit negativer Binomialverteilung
- Abschluss
Die Poisson-Wahrscheinlichkeitsverteilung zeigt die Wahrscheinlichkeit, dass ein Ereignis in einem festen Zeitraum oder Raum eintritt. Diese Daten können mit Python als Histogramm dargestellt werden, um die Häufigkeit des Auftretens des Ereignisses zu beobachten.
Verteilungen sind Kurven, die auf den Histogrammen oder anderen Strukturen aufgetragen werden können, um die am besten passende Kurve für den Datensatz zu finden. In diesem Artikel erfahren Sie, wie Sie die Poisson-Verteilung mithilfe von Python an einen Datensatz anpassen.
Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an
Lassen Sie uns verstehen, wie Sie mehrere Verteilungen auf einem Datensatz zeichnen und die Poisson-Verteilung mit SciPy und Python anpassen.
Binned-Least-Squares-Methode zur Anpassung der Poisson-Verteilung in Python
In diesem Beispiel wird ein Dummy-Poisson-Datensatz erstellt und ein Histogramm mit diesen Daten gezeichnet. Nachdem das Histogramm gezeichnet wurde, passt die klassierte Methode der kleinsten Quadrate eine Kurve über dem Histogramm an, um die Poisson-Verteilung anzupassen.
Importfunktionen für das Programm
Dieses Programm verwendet die folgenden Importfunktionen.
- Mathematischer Arm von Matplotlib -
Numpy
. - Die Matplotlib-Unterbibliothek
Pyplot
zum Zeichnen von Diagrammen. - SciPy
curve_fit
zum Importieren des Kurvenfits. poisson
für den Datensatz.
Erstellen Sie einen Dummy-Datensatz für die Poisson-Verteilung und zeichnen Sie das Histogramm mit dem Datensatz
Mit der Funktion np.random.poisson()
wird eine Variable dataset_size
mit von Poisson abweichenden Zahlen im Bereich von 4–20.000 erstellt. Es gibt ein Array mit zufälligen Poisson-Werten zurück.
data_set = np.random.poisson(4, 2000)
Die Unterschiede in den Histogrammdaten werden in einer neuen Variablen, bins
, gespeichert. Es verwendet die Funktion np.arrange()
, um ein Array mit Werten im Bereich von -0.5
bis 20
mit 0.5
als mittlerer Differenz zurückzugeben.
bins = np.arange(20) - 0.5
Ein Histogramm wird mit der Funktion plt.hist()
gezeichnet, wobei die Parameter sind:
data_set
für die verwendeten Daten.bins
für die Unterschiede.Dichte
, die auf wahr gesetzt wird.label
, das dem Diagramm ein Label hinzufügt.
Während das Histogramm gezeichnet wird, werden drei Werte von der Funktion plt.hist()
zurückgegeben, die in drei neuen Variablen gespeichert werden – entries
für Werte von Histogramm-Bins, bin_edges
für Kanten von Bins und patches
. für einzelne Patches für das Histogramm.
entries, bin_edges, patches = plt.hist(data_set, bins=bins, density=True, label="Data")
Passen Sie die Kurve mit Curve Fit an das Histogramm an
Sobald das Histogramm gezeichnet ist, wird die Kurvenanpassungsfunktion verwendet, um die Poisson-Verteilung an die Daten anzupassen. Die Kurvenfunktion zeichnet die beste Anpassungslinie aus einem verstreuten Datensatz.
Die Kurvenanpassung erfordert eine Anpassungsfunktion, die ein Array von Werten in eine Poisson-Verteilung umwandelt und diese als Parameter zurückgibt, auf denen die Kurve gezeichnet wird. Eine Methode fit_function
wird mit zwei Parametern k
und parameters
erstellt.
Zum Abrufen der Parameter wird die SciPy-Bibliothek poisson.pmf
verwendet. Das pmf
steht für Wahrscheinlichkeitsmassenfunktion, und diese Funktion gibt die Häufigkeit einer Zufallsverteilung zurück.
Die Variable k
speichert, wie oft das Ereignis aufgetreten ist, und die Variable lamb
ist der popt
(Summe reduzierter Quadrate), der als Anpassungsparameter für die Kurvenfunktion verwendet wird.
Die SciPy-Funktion curve_fit
übernimmt drei Parameter, fit_function
, middle_bins
und entries
, und gibt zwei Werte zurück – parameter
(optimale Werte, die die Summe der quadratischen Residuen reduzieren) und cov_matrix
(parameters
geschätzte Kovarianz).
parameters, cov_matrix = curve_fit(fit_function, middles_bins, entries)
Zur Darstellung der Kurve wird ein Datensatz mit 15 aufsteigenden Werten erstellt und die Poisson-Verteilung dieser aufsteigenden Werte mit der Methode fit_function
angepasst. Die Attribute des Diagramms werden bereitgestellt, und das Ergebnis wird angezeigt.
x_plot = np.arange(0, 15)
plt.plot(
x_plot,
fit_function(x_plot, *parameters),
marker="D",
linestyle="-",
color="red",
label="Fit result",
)
Vollständiger Code:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats import poisson
# get random numbers that are poisson deviated
data_set = np.random.poisson(4, 2000)
# the bins have to be kept as a positive integer because poisson is a positive integer distribution
bins = np.arange(20) - 0.5
entries, bin_edges, patches = plt.hist(data_set, bins=bins, density=True, label="Data")
# calculate bin centers
middles_bins = (bin_edges[1:] + bin_edges[:-1]) * 0.5
def fit_function(k, lamb):
# The parameter lamb will be used as the fit parameter
return poisson.pmf(k, lamb)
# fit with curve_fit
parameters, cov_matrix = curve_fit(fit_function, middles_bins, entries)
# plot poisson-deviation with fitted parameter
x_plot = np.arange(0, 15)
plt.plot(
x_plot,
fit_function(x_plot, *parameters),
marker="D",
linestyle="-",
color="red",
label="Fit result",
)
plt.legend()
plt.show()
Ausgang:
Verwenden Sie ein negatives Binomial, um die Poisson-Verteilung über einen übermäßig verteilten Datensatz anzupassen
In diesem Beispiel wird ein Poisson-Verteilungsdatenrahmen mit stark verteilten Daten erstellt, und wir werden lernen, wie die Poisson-Verteilung an diese Daten angepasst wird.
Im Gegensatz zum letzten Beispiel, bei dem die Poisson-Verteilung um ihren Mittelwert zentriert war, sind diese Daten stark gestreut, sodass diesen Daten im nächsten Abschnitt ein negatives Binomial hinzugefügt wird, um die Poisson-Verteilung zu verbessern.
Erstellen Sie den Datensatz
In diesem Beispiel wird ein Pandas-Datenrahmen erstellt und in der Variablen dataset
gespeichert. Dieser Datensatz hat eine Spalte, Occurrence
mit 2000
Poisson-Werten und dem Wert von Lambda, der auf 200
gesetzt ist.
dataset = pd.DataFrame({"Occurrence": np.random.poisson(200, 2000)})
Zeichnen Sie das Histogramm mit dem Datensatz
Um das Histogramm zu zeichnen, müssen wir drei Werte bereitstellen, Intervalle der Bins (Bucket of Values), den Beginn der Bins und das Ende der Bins. Dies geschieht durch:
width_of_bin = 15
xstart = 150
xend = 280
bins = np.arange(xstart, xend, width_of_bin)
Sobald der Wert von Bins festgelegt ist, zeichnen Sie das Histogramm.
hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)
Passen Sie die Poisson-Verteilungskurve an das Histogramm an
Der Mittelwert und die Größe des Datensatzes sind erforderlich, um die Poisson-Verteilung durch Zeichnen der Verteilungskurve anzupassen. In zwei neuen Variablen mu
und n
werden jeweils Mittelwert und Grösse des Datensatzes gespeichert.
Der Algorithmus zum Zeichnen der Poisson-Verteilungskurve lautet:
bins + width_of_bin / 2, n * (
poisson.cdf(bins + width_of_bin, mu) - poisson.cdf(bins, mu)
)
Zuletzt wird die Kurve in das Histogramm eingetragen.
Vollständiger Code:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import poisson
dataset = pd.DataFrame({"Occurrence": np.random.poisson(200, 2000)})
width_of_bin = 15
xstart = 150
xend = 280
bins = np.arange(xstart, xend, width_of_bin)
hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)
mu = dataset["Occurrence"].mean()
n = len(dataset)
plt.plot(
bins + width_of_bin / 2,
n * (poisson.cdf(bins + width_of_bin, mu) - poisson.cdf(bins, mu)),
color="red",
)
plt.show()
Ausgang:
Poisson-Verteilung für stark gestreute Daten mit negativer Binomialverteilung
Wie bereits erwähnt, sind die Daten in diesem Datensatz zu stark verstreut, weshalb die Kurve nicht perfekt einer Poisson-Verteilungskurve ähnelt. Im folgenden Beispiel wird ein negatives Binomial verwendet, um die Poisson-Verteilung anzupassen.
Der Datensatz wird durch Einfügen eines negativen Binoms erstellt:
dataset = pd.DataFrame({"Occurrence": nbinom.rvs(n=1, p=0.004, size=2000)})
Der Bin für das Histogramm beginnt bei 0
und endet bei 2000
mit einem gemeinsamen Intervall von 100
.
binwidth = 100
xstart = 0
xend = 2000
bins = np.arange(xstart, xend, binwidth)
Nachdem die Bins und der Datensatz erstellt wurden, wird das Histogramm gezeichnet:
hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)
Die Kurve erfordert fünf Parameter, Varianz (Var
), Mittelwert (mu
), p
(Mittelwert/Varianz), r
(berücksichtigte Elemente) und n
(Gesamtelemente im Datensatz).
Die Varianz und der Mittelwert werden in zwei Variablen berechnet, Varianz
und mu
.
Var = dataset["Occurrence"].var()
mu = dataset["Occurrence"].mean()
Die folgenden Formeln werden verwendet, um das p
und r
herauszufinden:
p = mu / Var
r = mu ** 2 / (Var - mu)
Die Gesamtzahl der Artikel wird gespeichert, indem die Länge des Datensatzes in einer neuen Variablen n
gespeichert wird.
n = len(dataset)
Zuletzt wird die Kurve in das Histogramm eingetragen.
plt.plot(
bins + binwidth / 2,
n * (nbinom.cdf(bins + binwidth, r, p) - nbinom.cdf(bins, r, p)),
)
Vollständiger Code:
import numpy as np
from scipy.stats import nbinom
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dataset = pd.DataFrame({"Occurrence": nbinom.rvs(n=1, p=0.004, size=2000)})
binwidth = 100
xstart = 0
xend = 2000
bins = np.arange(xstart, xend, binwidth)
hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)
Var = dataset["Occurrence"].var()
mu = dataset["Occurrence"].mean()
p = mu / Var
r = mu ** 2 / (Var - mu)
n = len(dataset)
plt.plot(
bins + binwidth / 2,
n * (nbinom.cdf(bins + binwidth, r, p) - nbinom.cdf(bins, r, p)),
color="red",
)
plt.show()
Ausgang:
Abschluss
In diesem Artikel werden drei Möglichkeiten zum Anpassen einer Poisson-Verteilung an ein Dataset in Python erläutert. Nach dem Lesen des Artikels kann der Leser die Poisson-Verteilung über Dummy-Poisson-Datensätze und übermäßig verteilte Datensätze anpassen.