如何生成显示正态分布倒钟形曲线的数据

How can I generate data which will show inverted bell curve for normal distribution

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

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()

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

如果我想创建一个如下图所示的反向曲线的分布图,我该如何生成随机正态分布数据?

我想要分布图将显示反向曲线的数据。如何生成此正态分布数据?

不确定这有多大用处,但使用拒绝抽样很容易做到。从 借用 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 轴是 [-4, +4])。此外,生成 KDE 感觉不太有用,因为它会与边缘的不连续性作斗争