【问题标题】:numpy draw a few bernoulli distributions at oncenumpy 一次绘制几个伯努利分布
【发布时间】:2016-04-04 09:03:45
【问题描述】:

假设我想立即从伯努利分布列表中提取,例如概率[0.1, 0.2, 0.3]。我可以使用 for 循环来做到这一点,但有没有更好的 numpy 方式(使用 scipy 也可以)?

ps = [0.1, 0.2, 0.3]
[np.random.choice(2, p=[1 - p, p]) for p in ps]

【问题讨论】:

    标签: python numpy random


    【解决方案1】:

    你可以从二项式中画出n=1,这相当于伯努利。由于二项式接受一个数组作为概率参数,您可以使用:

    np.random.binomial(1, p=ps)
    

    您可以通过为某些元素提供非常小/大的概率并多次调用该函数来测试它是否有效。

    例如,让ps = [0.23, 0.48, 0.64, 0.98]

    In [90]: np.sum([np.random.binomial(1,p=ps) for i in range(100000)], axis=0)
    Out[90]: array([23000, 48115, 64128, 97957])
    

    【讨论】:

      【解决方案2】:

      我建议宁愿使用(np.random.uniform(size=d) < probs) * 1,其中probs 是您的概率向量。这会生成统一的随机变量,然后将其阈值为01,获得1 的概率正是您在probs 中所拥有的。

      如果您只需要几个伯努利变量并且只需要一次 np.random.binomial 的解决方案应该没问题。但是,它似乎比使用均匀分布生成伯努利变量慢几倍。例如,如果我们有一些随机的概率向量 probs = np.uniform(size=10000), 然后我们得到

      %timeit np.random.binomial(n=1, p=probs, size=10000)
      Result: 775 µs ± 5.35 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      %timeit (np.random.uniform(size=10000) < probs) * 1
      Result: 103 µs ± 510 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2020-08-09
        • 2012-03-16
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多