如果不同的元素应该具有不同的概率,则numpy.random.choice方法可以生成一个随机样本而无需替换。但是,当我用
进行测试时import numpy
a = [0, 1, 2, 3, 4, 5]
p = [0.1, 0.3, 0.3, 0.1, 0.1, 0.1]
result = [0, 0, 0, 0, 0, 0]
N = 1000000
k = 3
for i in range(0, N):
temp = numpy.random.choice(a, k, False, p)
for j in temp:
result[j] += 1
for i in range(0, 6):
result[i] /= (N * k)
print(result)
第二个和第三个元素仅出现25%的时间,这相差很大。我尝试了不同的概率分布(例如[0.1、0.2、0.3、0.1、0.1、0.2]),并且每次结果都不符合预期时。我的代码有问题吗?还是numpy确实不正确?
答案 0 :(得分:2)
您对np.random.choice
函数的理解是错误的。特别是replace=
选项。 documentation表示replace=False
意味着一旦选择了一项,就不能再次选择它。可以通过运行来显示
for _ in range(100):
assert set(np.random.choice(np.arange(5), 5, replace=False)) == set(range(5))
,并没有看到任何错误提示。顺序更改,但是必须返回所有5个值。
由于此属性,您当前的方法给出了奇怪的结果。即使1和2出现在第一项中的机会为0.3,但它们出现在第二或第三项中的机会也少于0.3,因为如果它们是第一项,则不能成为第二项。>
解决方案显然是使用replace=True
(或忽略,True
是默认值),如下所示:
import numpy as np
a = [0, 1, 2, 3, 4, 5]
p = [0.1, 0.3, 0.3, 0.1, 0.1, 0.1]
n = 100_000
choices = np.random.choice(a, n, p=p)
values, counts = np.unique(choices, return_counts=True)
result = dict(zip(values, counts / n))
# result == {0: 0.10063, 1: 0.30018, 2: 0.30003, 3: 0.09916, 4: 0.10109, 5: 0.09891}