Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an

Jay Shaw 21 Juni 2023
  1. Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an
  2. Binned-Least-Squares-Methode zur Anpassung der Poisson-Verteilung in Python
  3. Verwenden Sie ein negatives Binomial, um die Poisson-Verteilung über einen übermäßig verteilten Datensatz anzupassen
  4. Poisson-Verteilung für stark gestreute Daten mit negativer Binomialverteilung
  5. Abschluss
Passen Sie die Poisson-Verteilung an verschiedene Datasets in Python an

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.

  1. Mathematischer Arm von Matplotlib - Numpy.
  2. Die Matplotlib-Unterbibliothek Pyplot zum Zeichnen von Diagrammen.
  3. SciPy curve_fit zum Importieren des Kurvenfits.
  4. 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:

  1. data_set für die verwendeten Daten.
  2. bins für die Unterschiede.
  3. Dichte, die auf wahr gesetzt wird.
  4. 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:

Klassierte Methode der kleinsten Quadrate zur Anpassung an die Poisson-Verteilung

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:

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

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:

Poisson-Verteilung für stark gestreute Daten mit negativer Binomialverteilung

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.

Verwandter Artikel - Python Math