从一组x个项目中,重复每个项目y次,以使y服从正态分布

时间:2019-02-04 03:02:24

标签: python numpy scipy

从一组x个唯一项目中,我需要重复每个项目y次,以使y服从正态分布。

例如,如果项目数n = 5,并且y_max = 50。 如果我们计算一下已排序列表中每个项目的重复次数,视觉效果将如下所示:

enter image description here

my_set=('a','b','c','d','e')
distribution = np.random.normal(len(my_set)/2, 1,len(my_set)).round().astype(int)
np.repeat(my_set, distribution)

我希望结果遵循与图表类似的趋势,但是结果遵循上升或下降趋势。

出于可读性考虑,我将使用元组而不是将每个项目重复y次。

预期结果应类似于:

[('a', 2), ('b', 4), ('c', 5), ('d', 3), ('e', 1)]

实际结果:

[('a', 5), ('b', 4), ('c', 3), ('d', 4), ('e', 3)]

1 个答案:

答案 0 :(得分:1)

首先,让我们生成所需的结果。

my_set = ('a', 'b', 'c', 'd', 'e')
distribution = np.random.normal(len(my_set)/2, 1, 10000).round().astype(int)
result = [my_set[max(min(el, 4), 0)] for el in distribution]
np.unique(result, return_counts=True)
>>> (array(['a', 'b', 'c', 'd', 'e'], dtype='<U1'),
>>> array([ 234, 1377, 3421, 3374, 1594]))

这里,我们从给定的分布中生成10000个随机值,并采用相应的字母代替每个数字。因此,计数仅代表我们正在寻找的东西:每个字母的出现次数通常是可分配的。

代码中的核心问题是了解什么是分布或什么值正态分布。 当我们调用np.random.normal时,它所做的只是生成一个正态分布的变量。根据正态分布的定义,这意味着一定数量的x以一定的概率p = {pdf normal出现。从频率的角度来看,这意味着如果我们多次运行变量生成,则试验总数中的p部分将是x。而这正是我们想要的。

在您的代码中,您正在做的是这样的变量:发生的次数本身是正态分布的。这意味着每个字母将在n +- s正态分布的位置出现s次。因此它基本上是正态分布,具有正态误差。仔细阅读您的文章,我认为这不是您想要的东西。