首页 > 解决方案 > 如何在不替换的情况下使用 numpy.random.choice 中的权重来获得所需的样本

问题描述

我有一个包含 400,000 个零和 100,000 个的数组,我想在不替换它的情况下进行抽样,以获得大约 50% 的零和 50% 的。

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

weight = desired_prob/actual_prob(归一化以使总和等于 1)因此 1 的权重为 2.5,0 的权重为 0.625

我希望给定下面的代码,我将能够使用 np.random.choice 获得一个样本,随着我增加样本量(最大为 200,000,在这种情况下我会使用所有的 1)。如果替换=真,则为真。

但如果我不想使用替换,那么我发现随着样本量的增加,均值首先向 0.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")

在此处输入图像描述

标签: pythonnumpyprobability

解决方案


如果您的样本量大于您的总体大小(如果替换 = False),则 Numpy 应该引发值错误。它不抛出错误的事实一定是一个错误。

编辑:我看错了号码。现在我看到了这个问题。是的,如果您在没有更换的情况下进行抽样,并且可能性 1 和 0 的权重与您设置的一样,然后在您采样时,您最初将以相同的速率移除 1 和 0。最终,您将开始用完 1 进行采样(请记住replacement=False:)即使 1 的权重最初设置为 0 的权重的 4 倍。所以是的,你是对的,你传递给np.random.choice它的权重在采样时不会改变,这将需要 numpy 每次都重新标准化你的权重,这将是低效的,而且没有任何意义,因为实际上没有任何需要以您要求的这种方式进行计算。但要回答你的问题,如果你真的想这样做,你可以这样做:

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:
    #
    # sample one by one
    #
    means.append(np.mean([np.random.choice(array, 1, False, p=normalized_weights) for _ in range(sample_sizes)]))
plt.plot(sample_sizes, means, marker="x")
plt.ylabel("Mean")
plt.xlabel("Sample size")

也就是说,不幸的是,您实际上必须对它们进行一一采样才能达到预期的效果


推荐阅读