生成过滤后的随机样本,可以使用相同的种子进行复制

问题描述 投票:0回答:1

我有 $10$ 随机变量 $X_1, X_2, \ldots X_{10} \sim \mathcal{N(0,1)}$,我想为它们生成 $5000$ 样本,这样 $X_1 < a$ and $X_i > a orall i \在 {2, 3, \ldots, 10}$ 中。

问题是我希望在给定相同的初始种子的情况下可以复制它。我的意思是,如果提供的种子相同,这应该会产生相同的样本。

我事先不知道要生成多少样本,以便在过滤后产生 5000 美元的良好模拟(满足过滤标准)。我尝试以 100,000 美元的块来运行它,将初始种子设置为某个固定值 $s$,如果第一个块无法生成足够数量的样本,我必须重新运行另一个块的模拟,但显然可以'不要再次使用相同的种子。另外,我不确定将每个块的种子设置为其他值是否不会在不同块中的样本之间产生不需要的相关性。

有办法实现这一点吗?我还想指出,性能很重要,所以如果可能的话,请建议一些适合并行化的东西,或者可以通过使用 numba 来加速的东西。

非常感谢。

numpy random filter random-seed
1个回答
0
投票

为了满足您的要求,我们可以尝试采用系统方法来确保可复制性、满足您的过滤标准并保持性能效率。

这里的关键是以这样的方式管理随机种子进程,即允许在不同的运行中获得可重现的结果,同时还可以在需要时生成额外的样本。

我们需要处理

seed
以确保可复制性并避免不必要的相关性,我们将使用基础种子并以确定性的方式为每个新的生成块增加它:

base_seed = 12345

现在,我们需要处理高效的过滤和采样来处理性能方面,特别是当我们不确定最初生成多少个样本时,我们可以使用一个生成一定数量样本的循环,根据您的标准过滤它们,并检查是否满足所需的样本数量。如果没有,它将继续使用新种子。

def generate_and_filter_samples(seed, a, num_samples_needed):
    np.random.seed(seed)
    samples_meet_criteria = []

    while len(samples_meet_criteria) < num_samples_needed:
        # Generate samples for X_1 to X_10
        samples = np.random.randn(100000, 10)  # Adjust size as needed

        # Filter samples based on your criteria
        filtered = samples[(samples[:, 0] < a) & np.all(samples[:, 1:] > a, axis=1)]

        # Append to the list
        if filtered.size > 0:
            samples_meet_criteria.extend(filtered.tolist())

    return np.array(samples_meet_criteria[:num_samples_needed])

最后,我们还有最后一个问题要处理:并行化和性能 对于性能而言,尤其是在样本数量如此之多且需要过滤的情况下,使用 NumPy 等库因其高效的数组操作而至关重要。

虽然 NumPy 不直接支持我们运行多个进程或线程的并行化,但它针对向量化操作进行了高度优化,使其对于生成和过滤大型随机数数组等操作非常快速。对于真正的并行化,尤其是跨多个生成块,我们可以考虑使用多处理来管理单独的进程,每个进程都有其种子。然而,如果过滤过程变得复杂,将 NumPy 与 Numba 结合起来进行即时编译可以显着加快过滤过程。

@jit(nopython=True)
def generate_and_filter_samples(seed, a, num_samples_needed):
  • 这是最终的代码:
import numpy as np
from numba import jit

# Setting a base seed for reproducibility
base_seed = 12345

# Function to generate and filter samples
@jit(nopython=True)
def generate_and_filter_samples(seed, a, num_samples_needed):
    np.random.seed(seed)
    samples_meet_criteria = []

    while len(samples_meet_criteria) < num_samples_needed:
        # Generate samples for X_1 to X_10
        samples = np.random.randn(100000, 10)  # Adjust size as needed

        # Filter samples based on your criteria
        filtered = samples[(samples[:, 0] < a) & np.all(samples[:, 1:] > a, axis=1)]
        if filtered.size > 0:
            samples_meet_criteria.extend(filtered.tolist())

    return np.array(samples_meet_criteria[:num_samples_needed])

# Criterion
a = 0.5
num_samples_needed = 5000

# Generate our samples
final_samples = generate_and_filter_samples(base_seed, a, num_samples_needed)
print(final_samples.shape)

© www.soinside.com 2019 - 2024. All rights reserved.