Ich möchte einen Poisson-Prozess generieren. Wenn die Anzahl der Ankünfte nach Zeit t ist N (t) und ich habe eine Poisson-Verteilung mit Parameter Lambda wie erzeuge ich N (t) ? Wie würde ich das in C ++ machen?
Ursprünglich wollte ich den Prozess mit einer Poisson-Verteilung erzeugen. Aber ich war verwirrt darüber, welche Parameter aus dem Prozess, den ich brauchte; Ich dachte, ich könnte N (t) verwenden, aber das sagt mir, wie viele Ankünfte im Intervall (0, t) aufgetreten sind, was nicht das war, was ich wollte. dann dachte ich, ich könnte N (t2) -N (t1) verwenden, um die Anzahl der Ankünfte im Intervall [t1, t2] zu erhalten. Da N ( t) ~ Poisson (tx lambda) Ich könnte Poisson (t2 x lambda) -Poisson (t1 x lambda) verwenden, aber ich möchte nicht die Anzahl der Ankünfte in einem Intervall.
Ich möchte vielmehr die expliziten Zeiten erzeugen, in denen die Ankunft stattfindet.
Ich könnte dies tun, indem ich das Intervall [t2, t1] ausreichend klein mache, so dass jedes Intervall nur eine Ankunft hat (was als | t2-t1 | - & gt; 0
Hier ist ein Beispielcode zum Erzeugen von Poisson-Beispielen mit C ++ TR1 .
Wenn Sie einen Poisson -Prozess wollen, sind die Zeiten zwischen den Ankünften exponentiell verteilt, und exponentielle Werte können mit der inversen CDF-Methode trivial erzeugt werden: -k * log (u) wobei u ein einheitlicher Zufall ist Variable und k ist der Mittelwert der Exponentialfunktion.
Wenn Sie einen Poisson-Prozess mit dem Ratenparameter L haben (das heißt, langfristig gibt es L Ankünfte pro Sekunde), dann sind die Zwischenankunftszeiten exponentiell mit dem Mittelwert 1 / L verteilt. Die PDF ist also f (t) = -L * exp (-Lt) und die CDF ist F (t) = Prob (T & lt; t) = 1 - exp (-Lt). Ihr Problem ändert sich also zu: Wie erzeuge ich eine Zufallszahl t mit der Verteilung F (t) = 1 - \ exp (-Lt)?
Wenn die von Ihnen verwendete Sprache eine Funktion hat (nennen wir sie rand()
), um gleichmäßig zwischen 0 und 1 verteilte Zufallszahlen zu erzeugen, reduziert sich die inverse CDF-Methode auf die Berechnung:
Da Python eine Funktion zum Erzeugen exponentiell verteilter Zufallszahlen bietet, könnten Sie die ersten 10 Ereignisse in einem Poisson-Prozess mit einer durchschnittlichen Rate von 15 Ankünften pro Sekunde simulieren:
%Vor%Beachten Sie, dass das die * inter * Ankunftszeiten erzeugen würde. Wenn Sie die Ankunftszeiten wünschen, müssten Sie eine Zeitvariable wie folgt weiterleiten:
%Vor%Ich wäre sehr vorsichtig bei der Verwendung der inversen CDF und pumpen eine einheitliche Zufallszahl durch. Das Problem hierbei ist, dass oft die inverse CDF numerisch instabil ist oder die Funktionen, um sie zu erzeugen, unerwünschte Fluktuationen nahe den Enden des Intervalls ergeben können. Aus diesem Grund würde ich etwas wie die Ablehnungsmethode in "Numerical Recipes in C" empfehlen. Siehe die POIDEV-Funktion in Abschnitt 7.3 des NRC: Ссылка
Um ein Muster aus einer Distribution auszuwählen, müssen Sie die inverse kumulative Verteilungsfunktion (CDF) berechnen. Sie wählen zunächst eine Zufallszahl gleichmäßig auf das reelle Intervall [0, 1] und nehmen dann die inverse CDF dieses Werts.
Wenn Sie Python verwenden, können Sie mit random.expovariate (rate) Ankunftszeiten bei Rate-Ereignissen pro Zeitintervall generieren
In Python können Sie unter dem folgenden Code versuchen.
Wenn Sie in 60 Sekunden 20 zufällige Messwerte generieren möchten. dh (20 ist das Lambda)
Das Erzeugen von Ankunftszeiten über den Poisson-Prozess bedeutet nicht die Verwendung einer Poisson-Verteilung. Dies geschieht durch Erstellen einer Exponentialverteilung basierend auf der Poisson-Ankunftsrate Lamda.
Kurz gesagt, Sie müssen eine exponentielle Verteilung mit einem Durchschnittswert = 1 / lamda erzeugen, siehe folgendes Beispiel:
%Vor%Das Ergebnis der Ausführung dieses Codes:
%Vor%Sie können also basierend auf Ihrem Experiment entweder newArrivalTime oder sumArrivalTimes verwenden.
Hinweis: Ссылка
Tags und Links random poisson stochastic-process