【问题标题】:Numpy random sampling from multiple distributions来自多个分布的 Numpy 随机抽样
【发布时间】:2020-06-10 17:50:26
【问题描述】:

什么是对 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 空间。有没有更有效的vectorized(即没有O(N) python for-loops)方法来实现这一点?

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

【问题讨论】:

    标签: python numpy random statistics probability


    【解决方案1】:

    您可以使用np.unique 来准确确定您需要从每个分布中获得多少样本。这需要一个大小为O(D) 的Python 循环。空间复杂度为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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多