python - 如何在不替换的情况下使用 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")
解决方案
如果您的样本量大于您的总体大小(如果替换 = 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")
也就是说,不幸的是,您实际上必须对它们进行一一采样才能达到预期的效果
推荐阅读
- sftp - 从 SFTP 文件夹复制和删除文件
- javascript - 如何用“onerror”捕获“ReferenceError”
- powershell - 嵌套 If 语句 first -notlike 条件
- c++ - 检测输入字符串是否有空格
- excel - Excel VBA 438 错误在 PC 上引发,但在 Mac 上没有
- magento2 - 缺少css文件的没有背景的按钮
- transparency - 有没有办法用 Allegro 创建一个半透明的窗口?
- c# - 如何删除 DataGrid 中的选定列?(C#/WPF)
- javascript - 如何检查多个数组上的键值对并使用 javascript 进行过滤?
- algorithm - 前 N 个允许分布式数据的重复算法