如何在Python中更快地对非均匀泊松过程进行​​采样?

时间:2015-09-22 08:46:09

标签: python random random-sample poisson

我正在以毫秒时间尺度对泊松过程进行​​采样,其中速率不固定。我通过检查每个大小增量区间来确定采样过程,根据该区间内的平均速率检查是否存在事件。由于我使用的是Python,它的运行速度比我希望的要慢一些。我目前使用的代码如下:

import numpy
def generate_times(rate_function,max_t,delta):
    times = []
    for t in numpy.arange(delta,max_t,delta):
        avg_rate = (rate_function(t)+rate_function(t+delta))/2.0
        if numpy.random.binomial(1,1-math.exp(-avg_rate*delta/1000.0))>0:
            times.extend([t])
    return times

费率函数可以是任意的,我不会在给定费率函数的情况下寻找封闭形式的解决方案。

如果您想要播放一些参数,可以尝试:

max_t = 1000.0
delta = 0.1
high_rate = 100.0
low_rate = 0.0
phase_length = 25.0
rate_function = (lambda x: low_rate + (high_rate-low_rate)*0.5*(1+math.sin(2*math.pi*x/phase_length)))

1 个答案:

答案 0 :(得分:4)

这是一个运行速度快75倍并实现相同功能的版本:

def generate_times_opt(rate_function,max_t,delta):
    t = numpy.arange(delta,max_t, delta)
    avg_rate = (rate_function(t) + rate_function(t + delta)) / 2.0
    avg_prob = 1 - numpy.exp(-avg_rate * delta / 1000.0)
    rand_throws = numpy.random.uniform(size=t.shape[0])

    return t[avg_prob >= rand_throws].tolist()

输出:

11:59:07 [70]: %timeit generate_times(rate_function, max_t, delta)
10 loops, best of 3: 75 ms per loop

11:59:23 [71]: %timeit generate_times_opt(rate_function, max_t, delta)
1000 loops, best of 3: 1.15 ms per loop

旁注:但这不是模拟非均匀泊松过程的最佳方法。来自Wikipedia

  

强度函数λ(t)的非均匀泊松过程可以通过具有固定速率λ的齐次泊松过程的拒绝采样来模拟:选择足够大的λ使得λ(t)=λp(t)并模拟a具有速率参数λ的泊松过程。在时间t接受来自泊松模拟的事件,概率为p(t)。