11
votes

Comment puis-je générer un processus de Poisson?

Question originale:

Je veux générer un processus de Poisson. Si le nombre d'arrivées par temps t est n (t) et j'ai une distribution de poisson avec le paramètre λ comment puis-je générer N (t) ? Comment ferais-je cela en C ++?

Clarification:

Je voulais à l'origine générer le processus en utilisant une distribution de Poisson. Mais, j'ai été confus sur quel paramètre du processus dont j'avais besoin; Je pensais pouvoir utiliser n (t) mais cela me dit combien d'arrivées ont eu lieu sur l'intervalle (0, t] ce que je voulais. Alors, Ensuite, je pensais que je pourrais utiliser n (t2) -n (t1) pour obtenir le nombre d'arrivées sur l'intervalle [t1, t2] . depuis n ( t) ~ Poisson (TX λ) Je pourrais utiliser Poisson (T2 x λ) -poïisson (T1 x λ) mais je ne veux pas le nombre d'arrivées dans un intervalle. < / p>

plutôt, je veux générer les temps explicites que les arrivées se produisent à.

Je pourrais le faire en faisant l'intervalle [t2, t1] suffisamment petit de sorte que chaque intervalle n'a qu'une seule arrivée (qui se produit comme | t2-t1 | -> 0 ).


0 commentaires

8 Réponses :


1
votes

Pour choisir un échantillon à partir d'une distribution, vous devez calculer la fonction de distribution cumulative inverse (CDF). Vous choisissez d'abord un nombre aléatoire uniformément sur l'intervalle réel [0, 1], puis prenez ensuite le CDF inverse de cette valeur.


2 commentaires

Merci - mes pensées étaient juste que, mais je me suis senti étrange puisque le CDF génère n (t) mais pas t . Et, je ne connaissais pas la bonne façon d'échantillonner de n (t) pour obtenir un processus de Poisson. Que se passe-t-il si je ne échantillonnais pas uniformément du CDF (sera-t-il toujours un processus de Poisson)?


Inverser le CDF d'un poisson n'est pas facile ou efficace. Pour une approche plus efficace, voir le lien de Corwin ou voir ma réponse sur la manière d'utiliser C ++ TR1.



3
votes

Je ferais très attention à utiliser le CDF inverse et à pomper un nombre aléatoire uniforme à travers elle. Le problème ici est que souvent le CDF inverse est numériquement instable ou les fonctions à produire peuvent donner des fluctuations indésirables à proximité des extrémités de l'intervalle. Pour cette raison, je recommanderais quelque chose comme la méthode de rejet utilisé dans "Recettes numériques en C". Voir la fonction Poidev donnée dans CH 7.3 de NRC: http: //www.nrbook .COM / A / BookCPDF / C7-3.PDF


1 commentaires

Le lien est d'un PDF vierge. J'ai la version C ++ (V3 Je crois) et elle n'inclut même pas de déviation de Poisson. Mais, je crois comprendre que les écarts sont des échantillons de la distribution qui me laisserait où j'ai commencé.



5
votes

Voici un exemple de code pour générer des échantillons de poisson à l'aide de C ++ TR1 .

Si vous voulez un processus de poisson , les temps entre les arrivées sont distribués de manière exponentielle et les valeurs exponentielles peuvent être générées trivialement avec la méthode de CDF inverse: -K * journal (U) où vous êtes un uniforme aléatoire variable et k est la moyenne de l'exponentiel.


4 commentaires

N'est-ce pas un lien vers une distribution de Poisson, pas un processus de Poisson?


Bon point. Si vous souhaitez un processus de Poisson, les temps entre les arrivées sont distribués de manière exponentielle et que les valeurs exponentielles peuvent être générées de manière triviale avec la méthode inverse du CDF: -K * journal (U) où U est une variable aléatoire uniforme et K est la moyenne de l'exponentiel.


Au fait, la moyenne (échelle) de la distribution exponentielle 1 / k , pas k ?


Il existe deux conventions différentes pour le paramétrage de la distribution exponentielle.



1
votes

Si vous utilisez Python, vous pouvez utiliser Random.Expovariate (tarif) pour générer des heures d'arrivée à des événements de taux par intervalle de temps


0 commentaires

28
votes

Si vous avez un processus de Poisson avec le paramètre de taux L (ce qui signifie que, à long terme, il y a des arrivées par seconde), les temps d'arrivée sont ensuite distribués de manière exponentielle avec une moyenne 1 / l. Donc, le PDF est F (t) = -L * exp (-Lt) et le CDF est F (T) = prob (t supposer que la langue que vous utilisez a une fonction (appelons-le rand () ) pour générer des nombres aléatoires répartis uniformément entre 0 et 1, la technique de CDF inverse réduit le calcul: xxx

comme Python fournit une fonction pour générer de manière exponentielle distribuée de manière exponentielle. numéros aléatoires, vous pouvez simuler les 10 premiers événements d'un processus de Poisson avec un taux de navigation de 15 arrivées par seconde comme ceci: xxx

Notez que cela générerait le * inter * heures d'arrivée. Si vous vouliez les heures d'arrivée, vous devriez continuer à déplacer une variable de temps en avant comme ceci: xxx


2 commentaires

Assurez-vous de ne pas prendre le journal de 0 lorsque vous calculez journal (rand ()) . Un tour commun consiste à calculer journal (1.0 - rand ()) à la place, comme rand () renvoie généralement un numéro, qui est inférieur à 1.


Vous m'avez eu à "Notez que cela générerait les horaires d'arrivée inter inter ". "meilleure explication que j'ai vue sur cette



0
votes

La discussion ici dispose de tous les détails sur l'utilisation de l'échantillonnage inverse pour générer des interriviers, ce qui est généralement ce que les gens veulent faire pour les jeux.

https://stackoverflow.com/a/15307412/1650437


0 commentaires

0
votes

dans Python, vous pouvez essayer ci-dessous le code.

Si vous souhaitez générer 20 lectures aléatoires en 60 secondes. IE (20 est la Lambda)
xxx


0 commentaires

0
votes

Génération des horaires d'arrivée via Puisson Process ne signifie pas utiliser une distribution de Poisson. Cela se fait en créant une distribution exponentielle basée sur le taux d'arrivée de Poisson Lamda.

En bref, vous devez générer une distribution exponentielle avec une moyenne = 1 / Lamda, voir l'exemple suivant: P>

newArrivalTime:  21.6419    ,sumArrivalTimes:  21.6419
newArrivalTime:  1.64205    ,sumArrivalTimes:  23.2839
newArrivalTime:  8.35292    ,sumArrivalTimes:  31.6368
newArrivalTime:  1.82962    ,sumArrivalTimes:  33.4665
newArrivalTime:  34.7628    ,sumArrivalTimes:  68.2292
newArrivalTime:  26.0752    ,sumArrivalTimes:  94.3045
newArrivalTime:  63.4728    ,sumArrivalTimes:  157.777
newArrivalTime:  3.22149    ,sumArrivalTimes:  160.999
newArrivalTime:  1.64637    ,sumArrivalTimes:  162.645
newArrivalTime:  13.8235    ,sumArrivalTimes:  176.469


0 commentaires