我正在以毫秒时间尺度对泊松过程进行采样,其中速率不固定。我通过检查每个大小增量区间来确定采样过程,根据该区间内的平均速率检查是否存在事件。由于我使用的是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)))
答案 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)。