python-3.x - 如何根据概率分布在python中生成随机分类数据?

标签 python-3.x pandas numpy random

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

关于python-3.x - 如何根据概率分布在python中生成随机分类数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57435469/

相关文章:

Python - 打字 - 可订阅类型的联合

python - 如何在 python3 中将组织好的文件放入字典中?

python-3.x - np.argsort 和 pd.nsmallest 给出不同的结果

python - 使用 pandas 在 Excel 中应用条件格式不起作用

python - 子数据帧的子数据帧

python - 按名称和索引排列的 Numpy 结构化数组

python-3.x - 在我的应用程序中使用数据表

python - 如何在 Python 中查找相交索引和值?

python - 一些 Numpy 函数返回 ndarray 而不是我的子类

python-3.x - ValueError:没有足够的值使用OpenCV中的Contour解包(预期3,得到2)