首页 > 解决方案 > 整数序列的高效块引导

问题描述

我正在尝试阻止用于蒙特卡洛模拟的引导样本,并且需要在 Python 中生成包含块的大量索引值(整数)。我需要它非常快,但无法弄清楚如何对其进行矢量化。

我想生成大量路径,其中每条路径都包含一个长度为 L 的整数序列。假设我有一个从 0 到 N 的整数数组(表示索引),我将从中随机采样以构造每条路径。当我采样时,我选择一个从 0 到 N 的随机整数 i,然后为某个窗口 w 填充 i,i+1,i+2..,i+w 的路径。然后我选择另一个随机起始索引值并继续使用新窗口填充路径,重复直到路径完全填充。我对所有路径都这样做。

我想知道是否有一种方法可以加快这种方法的速度,而不必遍历每条路径,因为我打算生成大量路径(数百万)

我的 for 循环方法的示例如下:

paths = 10000
path_length = 500
window_length = 5
index = np.arange(0,5000)
simulated_values = np.zeros([paths,path_length])
n_windows = int(np.ceil(path_length/window_length))
for i in range(0, paths):
    temp=[]
    for n in range(0, n_windows):
        random_start = random.randint(0, len(index) - path_length)
        temp.extend(range(random_start, random_start + window_length))
    simulated_values[i,:] = temp
print(simulated_values) 

标签: pythonrandomsequencemontecarloresampling

解决方案


我在一个名为 recombinator 的 python 包中找到了一个解决方案。似乎足够快,并且支持 GPU 以提高速度

https://pypi.org/project/recombinator/

from recombinator.block_bootstrap import circular_block_bootstrap
index = np.arange(0,5000)
path_length = 500
window_length = 5
temp = circular_block_bootstrap(index,block_length=window_length,replications=1000000,replace=True, sub_sample_length=path_length)

推荐阅读