什么是对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循环)方式来实现?
如果不是一般情况,是否可以通过某种方式有效地生成上述特定组合分布?
答案 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)