Pregunta

Pregunta original:

Quiero generar un proceso de Poisson. Si el número de llegadas por el tiempo t es N (t) e I tienen una distribución de Poisson con parámetro λ como genero N (t) ? ¿Cómo puedo hacer esto en C ++?

Aclaración:

Al principio quería generar el proceso utilizando una distribución de Poisson. Sin embargo, yo estaba confundido acerca de qué parámetro del proceso que necesitaba; Pensé que podría utilizar N (t) pero eso me dice cuántas llegadas se han producido en el intervalo de (0, t] que no era lo que quería. Así, luego pensé que podría utilizar N (t2) -N (t1) para obtener el número de llegadas en el intervalo de [t1, t2] . Desde N ( t) ~ Poisson (tx λ) que podría utilizar Poisson (t2 x λ) -Poisson (t1 x λ) , pero no quiero que el número de llegadas en un intervalo.

Más bien, quiero para generar los tiempos explícitas que las llegadas se producen a.

Yo podría hacer esto haciendo que el intervalo de [t2, t1] lo suficientemente pequeño como para que cada intervalo tiene una sola llegada (que se produce como | t2-t1 | -> 0 ).

¿Fue útil?

Solución

Aquí es código de ejemplo para la generación de muestras de Poisson usando C ++ TR1 .

Si desea una Poisson Proceso , los tiempos entre llegadas se distribuyen de manera exponencial, y los valores exponenciales se pueden generar trivialmente con la inversa CDF método: log k * (u) donde u es un uniforme al azar variable y k es la media de la exponencial.

Otros consejos

Si tiene un proceso de Poisson con parámetro de velocidad L (sentido de que, a largo plazo, no son L llegadas por segundo), entonces los tiempos entre llegadas se distribuyen de forma exponencial con una media de 1 / L. Así que la PDF es f (t) = L * exp (-LT), y la CDF es F (t) = Prob (T

Suponiendo que el idioma que está utilizando tiene una función (vamos a llamarlo rand()) para generar números aleatorios uniformemente distribuidos entre 0 y 1, el inverso CDF técnica reduce a calcular:

-log(rand()) / L

Como pitón proporciona una función para generar números aleatorios distribuidos exponencialmente, se podía simular los primeros 10 eventos en un proceso de Poisson con una tasa de averate de 15 llegadas por segundo como esto:

import random
for i in range(1,10):
   print random.expovariate(15)

Tenga en cuenta que habría que generar los tiempos de llegada * * inter. Si quería los tiempos de llegada, que tendría que mantenerse en movimiento una variable de tiempo hacia adelante como esto:

import random
t= 0
for i in range(1,10):
   t+= random.expovariate(15)
   print t

Me gustaría tener mucho cuidado con el uso de la CDF inversa y el bombeo de un número aleatorio uniforme a través de él. El problema aquí es que a menudo la inversa CDF es numéricamente inestable o las funciones para producir que puede dar fluctuaciones indeseables cerca de los extremos del intervalo. Por esa razón recomendaría algo así como el método utilizado en el rechazo "Numerical Recipes en C". Véase la función poidev dada en el capítulo 7.3 de la NRC: http: //www.nrbook .com / a / bookcpdf / c7-3.pdf

Con el fin de recoger una muestra de una distribución, es necesario calcular la función de distribución acumulada inversa (CDF). En primer lugar, elige un número aleatorio uniformemente en el intervalo real [0, 1], y luego tomar la inversa CDF de ese valor.

Si está utilizando Python, puede utilizar random.expovariate (tasa) para generar los tiempos de llegada en los eventos de tasas por intervalo de tiempo

La discusión aquí tiene todos los detalles sobre el uso de muestreo inversa para generar interrelaciones llegadas, que suele ser lo que la gente quiere hacer para los juegos.

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

En Python, se puede tratar a continuación código.

Si desea generar 20 lecturas aleatorias en 60 segundos. es decir, (20 es el lambda)

 def poisson_job_generator():
    rateParameter = 1.0/float(60/20) 
    while True:
        sl = random.expovariate(rateParameter)

Generación de tiempos de llegada a través de proceso de Poisson no significa utilizar una distribución de Poisson. Se lleva a cabo mediante la creación de una distribución exponencial con base en la tasa de llegada de Poisson lambda.

En resumen, es necesario para generar una distribución exponencial con una media = 1 / lambda, véase el siguiente ejemplo:

#include <iostream>
#include <iterator>
#include <random>

int
main ()
{
 // seed the RNG
 std::random_device rd; // uniformly-distributed integer random number generator
 std::mt19937 rng (rd ()); // mt19937: Pseudo-random number generation

 double averageArrival = 15;
 double lamda = 1 / averageArrival;
 std::exponential_distribution<double> exp (lamda);

double sumArrivalTimes=0;
double newArrivalTime;


 for (int i = 0; i < 10; ++i)
  {
   newArrivalTime=  exp.operator() (rng); // generates the next random number in the distribution 
   sumArrivalTimes  = sumArrivalTimes + newArrivalTime;  
   std::cout << "newArrivalTime:  " << newArrivalTime  << "    ,sumArrivalTimes:  " << sumArrivalTimes << std::endl;  
  }

}

El resultado de ejecutar este código:

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

Por lo tanto, en función de su experimento También se puede usar: newArrivalTime o sumArrivalTimes.

  

ref: http: //www.math .wsu.edu / facultad / genz / 416 / lect / l05-45.pdf

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top