来自多个分布的大量随机抽样

时间:2020-02-26 19:14:59

标签: python numpy random statistics probability

什么是对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))
    )))

但是,这会生成N x D个随机数(其中D是分布数)并使用N x D空间。是否有一种更有效的 vectorized (即没有O(N) python for循环)方式来实现?

如果不是一般情况,是否可以通过某种方式有效地生成上述特定组合分布?

1 个答案:

答案 0 :(得分:0)

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

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)
相关问题