如何在numpy.random.choice中使用权重而不进行替换以获得所需的样本

问题描述 投票:1回答:1

我有一个400,000个零和100,000个零的数组,我想取一个样本而不替换它来获得大约50%的零和50%的零。

numpy.random.choice提供了指定选择概率分布的能力。因此,计算获得50/50所需的权重:

权重=期望概率/实际概率(归一化,因此总和等于1)因此1的权重为2.5,0的权重为.625

我希望给定下面的代码,我将能够使用np.random.choice获得一个样本,随着样本量的增加,该样本的平均值将收敛为0.5(在这种情况下,最大值为200,000)将使用所有1)。如果replace = True,则为true。

但是如果我不想使用替换,那么我发现随着样本数量的增加,均值首先移向.5,然后逐渐减小。我对此的唯一解释是numpy在内部按顺序进行采样,并且当它获得更多0时,它不会进行调整,因此获得1的可能性仍然与第一次采样时一样,但是我不确定。

为什么会发生这种情况,我如何称量它,以使我的样品具有所需的50/50比例而无需更换?

这是演示此的代码

import numpy as np
import matplotlib.pyplot as plt

array = np.r_[np.ones(100_000), np.zeros(400_000)]
weights = array.copy()
weights[weights==1] = 2.5
weights[weights==0] = 0.625
normalized_weights = weights / weights.sum()
sample_sizes = (1_000, 5_000, 10_000, 50_000, 100_000, 200_000)
means = []
for sample_size in sample_sizes:
    means.append(np.mean(np.random.choice(array, sample_size, False, p=normalized_weights)))
plt.plot(sample_sizes, means, marker="x")
plt.ylabel("Mean")
plt.xlabel("Sample size")

enter image description here

python numpy probability
1个回答
0
投票

如果替换为False,则样本数量大于总体数量时,numpy会产生值错误。它不会引发错误的事实一定是一个错误。screenshot of numpy documentation

© www.soinside.com 2019 - 2024. All rights reserved.