Numpy随机选择分布误差

Numpy random choice distribution error

我有一个数字列表和另一个与这些数字相对应的概率列表。我使用 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}

我错过了什么?

您完全不知道从分布中抽样在实践中是如何工作的。你永远不会 "get" 正确的分布,你总是得到它的近似值,因为你正在抽样。

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

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

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

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

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

马蒂亚斯说的是真的。

如果您确实想创建一个恰好包含 45 个零、45 个一和 10 个二的数组,形状为 (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}

抽样不会很精确,您可以通过列出您想要的所有数字然后随机洗牌来强制所有数字都在输出数组中:

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)))