【问题标题】:Numpy random choice distribution errorNumpy随机选择分布错误
【发布时间】:2018-05-02 12:06:47
【问题描述】:

我有一个数字列表和另一个与这些数字相对应的概率列表。我使用numpy.random.choice 创建一个随机二维数组:

choice = numpy.random.choice([10, 22, 30], [10, 10], p=[0.45, 0.45, 0.10])

choice 应该是 45 个 1、45 个 2 和 10 个 0,但经过几次运行后,我从未得到正确的分布。

unique, counts = numpy.unique(choice, return_counts=True)
print(dict(zip(unique, counts)))

{10: 49, 22: 37, 30: 14}
{10: 47, 22: 42, 30: 11}
{10: 40, 22: 51, 30: 9}

我错过了什么?

【问题讨论】:

    标签: python numpy random distribution


    【解决方案1】:

    您完全错过了从分布中抽样在实践中的工作原理。你永远不会“得到”正确的分布,你总是得到一个近似值,因为你在采样。

    只有在样本数量非常大的情况下,您才应该最终收敛到目标分布。但是由于采样是一个随机过程,所以过程的结果总是存在随机性的。

    这当然适用于使用(伪)随机数生成器生成数字。

    【讨论】:

      【解决方案2】:

      因此,如果您掷硬币一千次,您希望总是得到正好 500 次正面?

      如果您想控制每个结果的准确计数,则不能依赖概率 - 相反,从一个列表中选择(无需替换),其中每个结果都具有所需的多重性:

      numpy.random.choice([10] * 45 + [22] * 45 + [30] * 10, [10, 10], replace=False)
      

      【讨论】:

        【解决方案3】:

        马蒂亚斯说的是真的。

        如果您确实想创建一个包含 45 个零、45 个 1 和 10 个 2 且形状为 (10, 10) 但顺序随机的数组,您可以执行以下操作:

        import numpy as np
        zeros = np.array([0]*45)
        ones = np.array([1]*45)
        twos = np.array([2]*10)
        myarr = np.concatenate([zeros, ones, twos])
        
        # Random permutation, followed by reshaping in (10, 10) form
        choice = np.random.permutation(myarr).reshape(10,10)
        unique, counts = np.unique(choice, return_counts=True)
        print(dict(zip(unique, counts)))
        {0: 45, 1: 45, 2: 10}
        

        【讨论】:

          【解决方案4】:

          采样不会是精确的,您可以通过列出您想要的所有数字然后随机打乱它来强制所有数字都在输出数组中:

          import numpy
          import numpy.random
          
          numbers = numpy.asarray(45*[10]+45*[22]+10*[30])
          print (numbers)
          numpy.random.shuffle(numbers) # numbers is changed in place
          choice = numbers.reshape((10,10))
          
          print (choice)
          unique, counts = numpy.unique(choice, return_counts=True)
          print(dict(zip(unique, counts)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-28
            • 2014-06-20
            • 1970-01-01
            • 2015-07-09
            • 2017-09-16
            • 1970-01-01
            • 2016-11-08
            • 1970-01-01
            相关资源
            最近更新 更多