关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
2年前关闭。
Improve this question
我正在尝试从现有列中生成一个随机的分类变量列来创建一些合成数据。例如,如果我的列有 3 个值 0,1,2,其中 0 出现 50% 的时间,1 和 2 出现 30% 和 20% 的时间,我希望我的新随机列也具有相似(但不相同)的比例
使用 R 解决了交叉验证的类似问题。https://stats.stackexchange.com/questions/14158/how-to-generate-random-categorical-data .但是我想要一个 Python 解决方案
请您参考如下方法:
使用 np.random.choice()
并指定与选择数组对应的概率向量:
>>> import numpy as np
>>> np.random.seed(444)
>>> data = np.random.choice(
... a=[0, 1, 2],
... size=50,
... p=[0.5, 0.3, 0.2]
... )
>>> data
array([2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1,
1, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0, 2, 2, 2,
1, 1, 1, 0, 0, 1])
>>> np.bincount(data) / len(data) # Proportions
array([0.44, 0.32, 0.24])
随着样本量的增加,经验频率应向您的目标收敛:
>>> a_lot_of_data = np.random.choice(
... a=[0, 1, 2],
... size=500_000,
... p=[0.5, 0.3, 0.2]
... )
>>> np.bincount(a_lot_of_data) / len(a_lot_of_data)
array([0.499716, 0.299602, 0.200682])
正如@WarrenWeckesser 所指出的,如果您已经拥有一维 NumPy 数组或 Pandas 系列,您可以直接将其用作输入,而无需指定
p
.默认为
np.random.choice()
是用替换采样 (
replace=True
),因此通过传递原始数据,生成的分布应该近似于输入的分布。