문제

원래 질문 :

Poisson 프로세스를 생성하고 싶습니다. 시간이 지남에 따라 도착한 경우 ~이다 n (t) 그리고 매개 변수와 함께 포아송 분포가 있습니다 λ 어떻게 생성합니까? n (t)? C ++에서 어떻게해야합니까?

설명:

원래 포아송 분포를 사용하여 프로세스를 생성하고 싶었습니다. 그러나 나는 내가 필요한 프로세스에서 어떤 매개 변수에 대해 혼란 스러웠다. 나는 내가 사용할 수 있다고 생각했다 n (t) 그러나 그것은 간격에 얼마나 많은 도착이 일어 났는지 알려줍니다. (0, t 내가 원했던 것이 아니었다. 그래서, 나는 내가 사용할 수 있다고 생각했다 N (T2) -N (T1) 간격에 도착 수를 얻으려면 T1, T2. 부터 n (t) ~ Poisson (TX λ) 나는 사용할 수있다 포아송 (T2 X λ) -Poisson (T1 x λ) 그러나 나는 간격으로 도착의 수를 원하지 않습니다.

오히려, 나는 도착이 발생하는 명백한 시간을 생성하고 싶습니다.

나는 간격을 만들어 이것을 할 수 있습니다 T2, T1 각 간격이 하나만 도착할 수 있도록 충분히 작습니다 ( | T2-T1 | -> 0).

도움이 되었습니까?

해결책

다음은 Poisson 샘플을 사용하여 사용하기위한 샘플 코드입니다 C ++ TR1.

Poisson을 원한다면 프로세스, 도착 사이의 시간은 기하 급수적으로 분포되고, 역 CDF 방법으로 사소한 지수 값을 생성 할 수있다 : -K*log (u) 여기서 U는 균일 랜덤 변수이고 k는 지수의 평균이다.

다른 팁

속도 매개 변수 L (장기적으로 초당 L 도착이 있음을 의미)의 Poisson 프로세스가있는 경우, 차별 간 시간은 평균 1/L로 기하 급수적으로 분포됩니다. 따라서 pdf는 f (t) = -l*exp (-lt)이고 cdf는 f (t) = prob (t <t) = 1 -exp (-lt)입니다. 그렇다면 문제가 변경됩니다. 분포 f (t) = 1 - exp (-lt)로 임의의 숫자 t를 생성하는 방법은 무엇입니까?

사용하는 언어가 함수가 있다고 가정하면 ( rand()) 0과 1 사이에 균일하게 분포 된 랜덤 숫자를 생성하기 위해 역 CDF 기술은 계산으로 감소합니다.

-log(rand()) / L

Python은 기하 급수적으로 분산 된 랜덤 숫자를 생성하는 함수를 제공하므로 Poisson 프로세스에서 처음 10 개의 이벤트를 평균 15 개의 도착 속도로 다음과 같이 초당 10 개의 이벤트를 시뮬레이션 할 수 있습니다.

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

*인터 *도착 시간이 생성됩니다. 도착 시간을 원한다면 다음과 같이 시간 변수를 계속 움직여야합니다.

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

역 CDF를 사용하고 균일 한 임의의 숫자를 펌핑하는 데 매우주의를 기울일 것입니다. 여기서 문제는 종종 역 CDF가 수치 적으로 불안정하거나 생성하는 기능이 간격의 끝 근처에서 바람직하지 않은 변동을 줄 수 있다는 것입니다. 이런 이유로 나는 "C의 수치 레시피"에 사용 된 거부 방법과 같은 것을 권장합니다. NRC의 ch 7.3에서 주어진 poidev 함수를 참조하십시오. http://www.nrbook.com/a/bookcpdf/c7-3.pdf

분포에서 샘플을 선택하려면 역 누적 분포 함수 (CDF)를 계산해야합니다. 먼저 실제 간격 [0, 1]에서 임의의 숫자를 균일하게 선택한 다음 해당 값의 역 CDF를 취합니다.

Python을 사용하는 경우 Random.expovariate (rate)를 사용하여 시간 간격 당 비율 이벤트에서 도착 시간을 생성 할 수 있습니다.

여기에서 논의는 역 샘플링을 사용하여 전직 경로를 생성하는 것에 대한 모든 세부 사항이 있습니다. 이는 일반적으로 사람들이 게임을 위해하고 싶은 일입니다.

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

파이썬에서는 아래 코드를 시도 할 수 있습니다.

60 초 안에 20 개의 무작위 판독 값을 생성하려는 경우. 즉 (20은 람다)

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

포아송 프로세스를 통해 도착 시간을 생성한다고해서 포아송 분포를 사용하는 것은 아닙니다. Poisson 도착률 Lamda를 기반으로 지수 분포를 만들어 수행됩니다.

요컨대 평균 = 1/lamda의 지수 분포를 생성해야합니다. 다음 예를 참조하십시오.

#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;  
  }

}

이 코드를 실행 한 결과 :

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

따라서 실험을 기반으로 NewArrivalTime 또는 SumArrivalTimes를 사용할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top