我尝试从 12 个独特的组中随机抽样,每个组都有不同数量的观察值。我想从整个群体(数据框)中随机抽样,每个组都有相同的被选择概率。最简单的例子是一个包含 2 个组的数据框。
groups probability
0 a 0.25
1 a 0.25
2 b 0.5
using np.random.choice(df['groups'], p=df['probability'], size=100)
现在每次迭代都有 50% 的机会选择group a
并且有 50% 的机会选择group b
为了得出概率,我使用了以下公式:
(1. / num_groups) / size_of_groups
或者在Python中:
num_groups = len(df['groups'].unique()) # 2
size_of_groups = df.groupby('label').size() # {a: 2, b: 1}
(1. / num_groups) / size_of_groups
哪个返回
groups
a 0.25
b 0.50
这非常有效,直到我超过 10 个独特的组,之后我开始得到奇怪的分布。这是一个小例子:
np.random.seed(1234)
group_size = 12
groups = np.arange(group_size)
probs = np.random.uniform(size=group_size)
probs = probs / probs.sum()
g = np.random.choice(groups, size=10000, p=probs)
df = pd.DataFrame({'groups': g})
prob_map = ((1. / len(df['groups'].unique())) / df.groupby('groups').size()).to_dict()
df['probability'] = df['groups'].map(prob_map)
plt.hist(np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True))
plt.xticks(np.arange(group_size))
plt.show()
我期望在足够大的样本量下得到相当均匀的分布,但是当组数超过 11 时我得到了这些翅膀。如果我改变group_size
变量为 10 或更低,我确实得到了所需的均匀分布。
我无法判断问题是否出在我计算概率的公式上,或者可能是浮点精度问题?有人知道更好的方法来完成此任务,或者解决此示例吗?
提前致谢!