来自多个分布的 Numpy 随机抽样

Numpy random sampling from multiple distributions

什么是对 N 个数字进行采样的有效方法,其中每个数字都是通过首先从固定的预定列表中选择一个随机分布(使用某种特定的离散分布),然后从所选分布中采样来采样的。

因此,例如,如果我们想以 0.30 的概率选择 0,以 0.30 的概率选择 1,以 0.40 的概率选择 [0,1) 中均匀分布的任何实数,我们可以这样写:

np.choose(
    np.random.choice(2, size=N, p=[0.6, 0.4]),
    np.vstack((
        np.random.choice(2, size=(1,N)),
        np.random.uniform(size=(1,N))
    )))

但是这会生成 NxD 个随机数(其中 D 是分布数)并使用 NxD space.是否有更有效的 vectorized(即没有 O(N) python for 循环)实现此目的的方法?

如果不是在一般情况下,能否以其他方式有效地生成上述特定组合分布?

您可以使用 np.unique 来确定每个分布中您需要多少样本。这需要大小为 O(D) 的 Python 循环。 space复杂度是O(N),但是时间复杂度还是O(N * D)。您可以通过计算每个 D 的稀疏索引将其降为 O(N)

N = 10
D = 2

distributions = [
  lambda n: np.random.choice(2, size=n),
  lambda n: np.random.uniform(n),
]

ds = np.random.choice(D, p=[0.6, 0.4], size=N)
uniques, inverse, counts = np.unique(ds, return_inverse=True, return_counts=True)
result = np.zeros(N)
for d, c in zip(uniques, counts):
  result[inverse==d] = distributions[d](c)