如何生成显示正态分布倒钟形曲线的数据
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 感觉不太有用,因为它会与边缘的不连续性作斗争
我使用以下代码生成了服从正态分布的随机数据:
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()
以上代码按预期生成了以下分布图:
如果我想创建一个如下图所示的反向曲线的分布图,我该如何生成随机正态分布数据?
我想要分布图将显示反向曲线的数据。如何生成此正态分布数据?
不确定这有多大用处,但使用拒绝抽样很容易做到。从
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 感觉不太有用,因为它会与边缘的不连续性作斗争