Wie erstelle ich ein Poisson-Prozess?
Ursprünglichen Frage:
Ich will erzeugen einen Poisson-Prozess. Wenn die Anzahl der Ankünfte in der Zeit t ist N(t) und ich haben eine Poisson-Verteilung mit parameter λ wie erstelle ich N(t)? Wie würde ich das in C++?
Klarstellung:
Ursprünglich wollte ich zu generieren, den Prozess mit der Poisson-Verteilung. Aber, ich war verwirrt, über welche parameter aus dem Prozess, den ich brauchte; ich dachte, ich könnte N(t) aber, dass mir sagt, wie viele Ankünfte stattgefunden haben, auf dem Intervall (0,t] das war nicht das, was ich wollte. So, dann dachte ich, ich könnte N(t2)-N(t1), um die Anzahl der Ankünfte auf dem Intervall [t1,t2]. Da N(t)~Poisson(t x-λ), die ich verwenden könnte Poisson(t2 x, λ)-Poisson(t1 x-λ) aber ich will nicht, dass die Zahl der Ankünfte in einem Zeitintervall.
Vielmehr möchte ich zum generieren der expliziten mal, dass bei der Anreise auftreten, an.
Konnte ich dies, indem Sie das Intervall [t2,t1] ausreichend klein sein, so dass jedes Intervall nur eine Ankunft (was kommt als |t2-t1| -> 0).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist Beispielcode für das generieren von Poisson-Proben mit C++ - TR1.
Wenn Sie möchten, eine Poisson - Prozess, die Zeiten zwischen den Ankünften sind exponentiell verteilt, und exponential-Werte können erzeugt werden-trivial mit der inverse CDF-Methode: -k*log(u), wobei u eine uniform zufällige variable und k ist der Mittelwert des exponentiellen.
1/k
, nichtk
?Wenn Sie ein Poisson-Prozess mit rate parameter-L (das bedeutet, dass langfristig, gibt es L Ankünfte pro Sekunde), dann ist der inter-arrival times sind exponentiell verteilt mit Mittelwert 1/L. Also die PDF ist f(t) = -L*exp(-Lt), und die CDF F(t) = Prob(T < t) = 1 - exp(-Lt). Also dein problem änderungen auf: wie Generiere ich eine Zufallszahl t mit Verteilung F(t) = 1 - \exp(-Lt)?
Vorausgesetzt, die Sprache, die Sie verwenden, hat eine Funktion (nennen wir es
rand()
) zum generieren von Zufallszahlen, die gleichmäßig verteilt zwischen 0 und 1, die inverse CDF-Technik reduziert sich auf die Berechnung:Als python bietet eine Funktion zum generieren von exponentiell verteilten Zufallszahlen, könnten Sie simulieren die ersten 10 Ereignissen in einem poisson-Prozess mit einem averate rate von 15 Ankünfte pro Sekunde wie diese:
Beachten Sie, dass das generieren der *inter*Ankunftszeiten. Wenn Sie wollten, dass die Ankunftszeiten, Sie müssten in Bewegung bleiben eine Zeitvariable uns wie folgt:
log(rand())
. Ein üblicher trick ist es, zu berechnenlog(1.0 - rand())
statt, alsrand()
normalerweise eine Zahl zurückgibt, die kleiner als 1 ist.Wäre ich sehr vorsichtig mit der Verwendung der inverse CDF und Pumpen eine einheitliche Zufallszahl durch. Das problem hier ist, dass oft die inverse CDF ist numerisch instabil oder die Funktionen zu produzieren, kann es zu unerwünschten Schwankungen in der Nähe der enden des Intervalls. Aus diesem Grund würde ich empfehlen, so etwas wie die Ablehnung der Methode, die in "Numerical Recipes in C". Finden Sie die poidev Funktion in ch 7.3 NRC: http://www.nrbook.com/a/bookcpdf/c7-3.pdf
In, um sich zu erholen eine Stichprobe aus einer Verteilung, die Sie benötigen, um zu berechnen, die inverse cumulative distribution function (CDF). Sie zuerst wählen Sie eine Zufallszahl, die gleichmäßig auf dem rellen Intervall [0, 1], und nehmen Sie dann die inverse CDF dieses Wertes.
Wenn Sie mit python, können Sie mit random.expovariate(rate) zu generieren, die Ankunftszeiten bei der rate von Ereignissen pro Zeitintervall
Die Diskussion hier hat alle details über die Verwendung der inversen sampling zu generieren inter-Ankünfte, die in der Regel, was die Leute wollen Spiele.
https://stackoverflow.com/a/15307412/1650437
In python, können Sie versuchen, folgenden code.
Wenn Sie möchten, generieren Sie 20 zufällige Messwerte in 60 Sekunden. ie (20 ist die lambda -)
Erzeugung von Ankunftszeiten über Poisson-Prozess bedeutet nicht, mit einer Poisson-Verteilung. Es wird getan, indem eine exponentielle Verteilung, basierend auf der Poisson-ankunftsrate lamda.
Kurz gesagt, Sie brauchen, um zu generieren, eine exponentielle Verteilung mit Mittelwert = 1/lamda, siehe Folgendes Beispiel:
Das Ergebnis der Ausführung dieses Codes:
so, basierend auf Ihren Test, können Sie entweder: newArrivalTime oder sumArrivalTimes.