【问题标题】:How can I generate data which will show inverted bell curve for normal distribution如何生成将显示正态分布倒钟形曲线的数据
【发布时间】:2021-02-28 20:05:33
【问题描述】:

我使用以下代码生成了遵循正态分布的随机数据:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

rng = np.random.default_rng()
number_of_rows = 10000
mu = 0
sigma = 1
data = rng.normal(loc=mu, scale=sigma, size=number_of_rows)

dist_plot_data = sns.distplot(data, hist=False)
plt.show()

上面的代码按预期生成了下面的分布图:

如果我想创建一个正好是如下逆曲线的分布图,那么如何生成随机正态分布数据?

我想要分布图将显示逆曲线的数据。如何生成这个正态分布数据?

【问题讨论】:

标签: python-3.x random statistics numpy-ndarray normal-distribution


【解决方案1】:

不确定这有多大用处,但通过拒绝抽样很容易做到。从 Peter O's previous solution 借用 API,但使用块来提高性能给了我:

import numpy as np

def invNormal(low, high, mu=0, sd=1, *, size=1, block_size=1024):
    remain = size
    result = []
    
    mul = -0.5 * sd**-2

    while remain:
        # draw next block of uniform variates within interval
        x = np.random.uniform(low, high, size=min((remain+5)*2, block_size))
        
        # reject proportional to normal density
        x = x[np.exp(mul*(x-mu)**2) < np.random.rand(*x.shape)]
        
        # make sure we don't add too much
        if remain < len(x):
            x = x[:remain]

        result.append(x)
        remain -= len(x)

    return np.concatenate(result)

可以当sns.histplot(invNormal(-4, 4, size=100_000), bins=51),给我:

请注意,概率密度必须积分为 1,因此“越宽”,密度就越小(即,如果 x- 上的范围在 y 轴上的密度不能为 0.4轴是 [-4, +4])。此外,生成 KDE 感觉不太有用,因为它会与边缘的不连续性作斗争

【讨论】:

  • 如果我想使用均值和标准差值来生成数据,在您给定的示例中我该怎么做?
  • @BCSmith 我已经更新了代码以允许指定平均值和标准差
  • 我想将此方法推广到其他分布,如 weibul、beta、二项式、卡方等。我该如何推广或如何推广这些分布?
  • 我建议阅读一些统计数据...您只需将密度函数插入拒绝步骤
猜你喜欢
  • 2023-03-14
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多