【问题标题】:range() but with normal distribution? (no randomness)range() 但具有正态分布? (没有随机性)
【发布时间】:2020-07-31 03:48:21
【问题描述】:

寻找一个模拟 range() 的 python 函数,但它是一个正态分布而不是一个设定的间隔。

所以我想要mynormrange(min, max, numberofpoints) 这样的东西,而不是range(min, max, interval)。反转分布的选项也很棒。

所以mynormrange(0, 100, 9) 会输出类似[0, 34, 47.5, 49.85, 50, 50.15, 52.5, 66, 100] 的内容,其中平均值附近的数字(在本例中为avg=50)更接近。

而逆 mynormrange(0, 100, 9, inverse=True) 将输出类似 [0, 0.15, 2.5, 16, 50, 84, 97.5, 99.85, 100] 的内容,其中边缘周围的数字(在本例中为 0 和 100)更接近。

我不想要随机性,所以 random.normal() 不能满足我的需要。

类似于 numpy 的 linspace() 但用于正态分布。

编辑:我只是要结合 linspace 和余弦乘以我想要的最大值。正弦的倒数。

【问题讨论】:

  • 听起来你想要的是构造一个从 0 到 1 的普通、统一的范围(例如,0.1、0.2、0.3、... 0.9),然后将逆 cdf 映射到该范围上,这将给出分布的分位数。也许有一个分位数函数可以直接给出。
  • 我认为相反,正如你所描述的,是将 cdf 映射到一个均匀间隔的列表上。

标签: python statistics normal-distribution


【解决方案1】:

一种解决方案是使用截断的正态分布来生成数字并将范围的两端放在列表中。然后,按升序(逆序降序)对它们进行排序,并将其报告为您想要的。要绘制截断的正常样本,可以使用this post

但是,它不能是像range 这样的函数,因为它会生成随机结果(具有指定的分布)。请注意,您可以为[a,b](a+b)/2 的范围设置平均值,但您需要指定分布的方差(除非您根据给定范围定义它)。

请注意,您关于“我不想要随机性”的陈述在这里没有意义!因为您在谈论分发!

【讨论】:

    【解决方案2】:

    我相信您可以使用 np.random.normal() 之类的东西。

    这允许生成您想要的任何形状的数组。

    • 第一个参数 loc 是标准分布的中心,在上面的示例中为 50

    • 第二个参数scale 是分布的标准差(展开或“宽度”)。

    • 最后一个参数size 只是输出形状,可以是整数或整数元组

    然后我们将使用这个数组从分布中采样np.clip 输出到一个最小值-最大值(因为我们可以根据我们的数组大小获得极值)。最后我们用np.sort对输出进行排序

    def mynormrange(min, max, stddev, numberofpoints):
        # (min+max)//2 yields the centre point of our distribution 
        distribution = np.random.normal(loc=(min+max)//2, 
                                        scale=stddev,
                                        size=numberofpoints)
        return np.sort(np.clip(distribution, min, max), axis=None)
    
    >>> mynormrange(min=0, max=100, stddev=28, numberofpoints=20)
    array([ 0.        , 11.84519127, 16.3296094 , 24.55199703, 25.30222761,
           30.46270933, 30.52531999, 34.18142498, 42.30422449, 44.8864856 ,
           48.54756954, 56.00797349, 58.51853892, 58.65086592, 61.0481076 ,
           68.87172721, 77.65995267, 85.73321417, 86.2329193 , 86.31444371])
    

    至于这个的反面......我相信你可以找到一个类似的函数并使用与上面相同的采样技术。当/如果我发现了,我会评论/编辑。

    如果这有帮助,如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 2011-09-08
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多