从一组 x 唯一项中,我需要将每个项重复 y 次,以便 y 遵循正态分布。
例如,如果项目数 n = 5,y_max = 50。如果我们计算排序列表中每个项目重复的次数,视觉效果将如下所示:
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)]
首先,让我们生成所需的结果。
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 = 出现。从频率的角度来看,这意味着如果我们多次运行变量生成p
,则试验总数的比例将为x
。而这正是我们正在寻找的。
在您的代码中,您所做的是使出现次数本身呈正态分布的变量。这意味着每个字母将出现正态分布的n +- s
次数s
。所以它基本上是具有正态误差的正态分布。仔细阅读您的帖子,我认为这不是您要找的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句