如何在Python中更快地对非均匀泊松过程进行采样?
我正在以毫秒的时间尺度对泊松过程进行采样,在这里速率是不固定的。我通过检查大小为delta的每个间隔中是否存在基于该间隔中的平均速率的事件来离散采样过程。因为我使用的是Python,所以它的运行速度比我希望的要慢一些。我当前使用的代码如下所示:如何在Python中更快地对非均匀泊松过程进行采样?,python,random,random-sample,poisson,Python,Random,Random Sample,Poisson,我正在以毫秒的时间尺度对泊松过程进行采样,在这里速率是不固定的。我通过检查大小为delta的每个间隔中是否存在基于该间隔中的平均速率的事件来离散采样过程。因为我使用的是Python,所以它的运行速度比我希望的要慢一些。我当前使用的代码如下所示: import numpy def generate_times(rate_function,max_t,delta): times = [] for t in numpy.arange(delta,max_t,delta):
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)))
这是一个运行速度快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
旁注:这不是模拟非均匀泊松过程的最佳方法。发件人: 具有强度函数λ(t)的非齐次泊松过程可以通过对具有固定速率λ的齐次泊松过程进行拒绝采样来模拟:选择足够大的λ,使λ(t)=λp(t),并模拟具有速率参数λ的泊松过程。在时间t以概率p(t)接受来自泊松模拟的事件
你是在问如何优化
生成时间?它可以返回一个数组还是必须是一个列表?它不需要完全优化,运行时任何大于5的因子都会产生巨大的差异。输出必须是一个列表(如果速度更快的话,你最终可以将一个ndarray转换成一个列表…:P)。generate_times
似乎不完整,它从来不会给tunes添加任何内容
谢谢,现在修复了。你有没有看过其他关于在ndarray上矢量化计算的答案?太棒了,非常感谢,维基百科页面上的替代方案也很有意义。就速率函数有一个最大值和其他接近0的值而言,它很弱。