来自多个分布的 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))
)))
但是这会生成 N
xD
个随机数(其中 D
是分布数)并使用 N
xD
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)
什么是对 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
xD
个随机数(其中 D
是分布数)并使用 N
xD
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)