13

元の質問:

ポアソン過程を生成したい。時間tまでの到着数がN(t)で、パラメーターλのポアソン分布がある場合、N(t を生成するにはどうすればよいですか?C ++でこれを行うにはどうすればよいですか?

明確化:

私はもともと、ポアソン分布を使用してプロセスを生成したかったのです。しかし、私は必要なプロセスのどのパラメーターについて混乱していました。N(t)を使用できると思いましたが、間隔(0、t]で何回到着したかがわかりますが、これは私が望んでいたことではなかったので、N(t2)-N(t1 )区間[t1、t2]の到着数を取得します。N(t )〜Poisson(txλ)なので、 Poisson(t2xλ)-Poisson(t1xλ )を使用できますが、間隔内の到着数。

むしろ、到着が発生する明示的な時刻を生成したいと思います。

これを行うには、間隔[t2、t1]を十分に小さくして、各間隔に1回だけ到着するようにします(これは| t2-t1 |-> 0として発生します)。

4

8 に答える 8

31

速度パラメーター L のポアソン過程がある場合 (つまり、長期的には、1 秒あたり L の到着があることを意味します)、到着間の時間は平均 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 は指数分布の乱数を生成する関数を提供するため、次のように、1 秒あたり 15 の平均到着率でポアソン プロセスの最初の 10 個のイベントをシミュレートできます。

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

*inter*arrival 時間が生成されることに注意してください。到着時間が必要な場合は、次のように時間変数を進め続ける必要があります。

import random
t= 0
for i in range(1,10):
   t+= random.expovariate(15)
   print t
于 2012-04-20T17:35:44.200 に答える
6

C++ TR1を使用してポアソン サンプルを生成するサンプル コードを次に示します。

ポアソン過程が必要な場合、到着間の時間は指数関数的に分布し、指数関数値は逆 CDF メソッドで簡単に生成できます: -k*log(u) ここで、u は一様確率変数で、k は指数関数の平均です。

于 2009-07-21T00:40:19.057 に答える
3

逆CDFを使用し、それを介して均一な乱数をポンピングすることに非常に注意します。ここでの問題は、逆CDFが数値的に不安定であるか、それを生成する関数が区間の終わり近くで望ましくない変動を与える可能性があることです。そのため、「Cの数値レシピ」で使用されている棄却法のようなものをお勧めします。NRCの第7.3章に記載されているpoidev関数を参照してください:http ://www.nrbook.com/a/bookcpdf/c7-3.pdf

于 2009-07-20T21:15:38.580 に答える
1

Python を使用している場合は、random.expovariate(rate) を使用して、時間間隔ごとのレート イベントで到着時間を生成できます。

于 2011-04-15T04:55:07.547 に答える
1

分布からサンプルを選択するには、逆累積分布関数 (CDF) を計算する必要があります。最初に実区間 [0, 1] で一様に乱数を選択し、次にその値の逆 CDF を取得します。

于 2009-07-20T19:56:12.420 に答える
0

ここでの説明には、逆サンプリングを使用して到着間隔を生成する方法の詳細がすべて含まれています。これは通常、ゲームで人々がやりたいことです。

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

于 2013-03-09T05:15:20.190 に答える