3

谁能告诉我最好的方法是生成一个包含从 0 到 100 的值的(numpy)数组,该数组由(例如)具有平均值 50 和方差 5 的正态分布函数加权。所以有更多的 50 和更少(几乎没有)零和数百。我认为这个问题不应该太难解决,但我不知何故被卡住了......

我想到了 np.linspace 的一些东西,但似乎没有重量选项。

所以要明确一点:我不想要一个从 0 到 100 的简单正态分布,而是像一个从 0 到 100 的数组,中间的值密度更高。

谢谢

4

3 回答 3

4

您可以使用 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()

当然,我承认由于来回时的数值不准确,起点和终点并不完全像这样。

于 2013-02-24T12:28:21.407 回答
2

重要的是要理解,您的问题并不完全可以解决,因为通常有限的离散样本无法准确地重现您的分布。

当您询问问题的琐碎版本时,您可以很容易地看到这一点,例如 [0,1] 中具有相等分布的一组 3 个值。这里的结果 [0,0,1] 和 [0,1,1] 都是合理的。

但是,您可以大致解决问题。如果您要求一个数组的count元素超出[0,1,...,N]给定概率的位置p=[p0,p1,...,pN]并归一化( ),那么理论上,结果数组中的元素p0+...+pN==1计数是c_kk

c[k] = p[k]*count

但这些计数现在是浮点数。您必须决定一种方法来“四舍五入”它们,同时保持它们的总和。这是由于您的问题定义不足而产生的选择自由。

于 2013-02-25T10:03:19.007 回答
-1
>>> 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]
于 2013-03-02T19:29:54.710 回答