6

私の問題は、最も効率的な方法で N ポアソン乱数値 ( RV) をそれぞれ異なる mean/rate で抽出することLamです。基本的にはsize(RV) == size(Lam).

これは単純な (非常に遅い) 実装です。

import numpy as NP

def multi_rate_poisson(Lam):
    rv = NP.zeros(NP.size(Lam))
    for i,lam in enumerate(Lam):
        rv[i] = NP.random.poisson(lam=lam, size=1)
    return rv

私のラップトップでは、1e6サンプルで次のようになります。

Lam = NP.random.rand(1e6) + 1
timeit multi_poisson(Lam)
1 loops, best of 3: 4.82 s per loop

これから改善することは可能ですか?

4

1 に答える 1

2

ドキュメントストリングはこの機能を文書化していませんが、ソースは配列を numpy.random.poisson 関数に渡すことが可能であることを示しています。

>>> import numpy
>>> # 1 dimension array of 1M random var's uniformly distributed between 1 and 2
>>> numpyarray = numpy.random.rand(1e6) + 1 
>>> # pass to poisson
>>> poissonarray = numpy.random.poisson(lam=numpyarray)
>>> poissonarray
array([4, 2, 3, ..., 1, 0, 0])

ポアソン確率変数は、1の離散倍数を返し、ラムダが 1 を超えると釣鐘曲線に近似します。

>>> import matplotlib.pyplot
>>> count, bins, ignored = matplotlib.pyplot.hist(
            numpy.random.poisson(
                    lam=numpy.random.rand(1e6) + 10), 
                    14, normed=True)
>>> matplotlib.pyplot.show()

配列をポアソン発生器に渡すこの方法は、非常に効率的であるように見えます。

>>> timeit.Timer("numpy.random.poisson(lam=numpy.random.rand(1e6) + 1)",
                 'import numpy').repeat(3,1)
[0.13525915145874023, 0.12136101722717285, 0.12127304077148438]
于 2013-09-17T05:40:47.950 に答える