谁能告诉我最好的方法是生成一个包含从 0 到 100 的值的(numpy)数组,该数组由(例如)具有平均值 50 和方差 5 的正态分布函数加权。所以有更多的 50 和更少(几乎没有)零和数百。我认为这个问题不应该太难解决,但我不知何故被卡住了......
我想到了 np.linspace 的一些东西,但似乎没有重量选项。
所以要明确一点:我不想要一个从 0 到 100 的简单正态分布,而是像一个从 0 到 100 的数组,中间的值密度更高。
谢谢
您可以使用 scipy 的 stats 分布:
import numpy as np
from scipy import stats
# your distribution:
distribution = stats.norm(loc=50, scale=5)
# percentile point, the range for the inverse cumulative distribution function:
bounds_for_range = distribution.cdf([0, 100])
# Linspace for the inverse cdf:
pp = np.linspace(*bounds_for_range, num=1000)
x = distribution.ppf(pp)
# And just to check that it makes sense you can try:
from matplotlib import pyplot as plt
plt.hist(x)
plt.show()
当然,我承认由于来回时的数值不准确,起点和终点并不完全像这样。
重要的是要理解,您的问题并不完全可以解决,因为通常有限的离散样本无法准确地重现您的分布。
当您询问问题的琐碎版本时,您可以很容易地看到这一点,例如 [0,1] 中具有相等分布的一组 3 个值。这里的结果 [0,0,1] 和 [0,1,1] 都是合理的。
但是,您可以大致解决问题。如果您要求一个数组的count
元素超出[0,1,...,N]
给定概率的位置p=[p0,p1,...,pN]
并归一化( ),那么理论上,结果数组中的元素p0+...+pN==1
计数是c_k
k
c[k] = p[k]*count
但这些计数现在是浮点数。您必须决定一种方法来“四舍五入”它们,同时保持它们的总和。这是由于您的问题定义不足而产生的选择自由。
>>> sorted([int(random.gauss(50,5)) for i in range(100)])
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61]