关闭。这个问题需要更多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 ),因此通过传递原始数据,生成的分布应该近似于输入的分布。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!