创建一个数字数组,其频率类似于钟形曲线

时间:2019-02-28 20:38:30

标签: python-3.x scipy normal-distribution

我想创建一个数组A [1,1,2,2,2,5,5,5,....],其数字来自[a,b],这样

  • 直方图,其中Y轴是数组中数字的频率,X轴是[a,b] 类似于钟形曲线

    Bell Curve

  • [a,b]中所有i的频率(i)* i 之和大约为 K

Python中有许多功能,例如numpy.random.normalscipsy.stats.truncnorm,但我无法完全理解它们的用法以及它们如何帮助我创建这样的数组。

1 个答案:

答案 0 :(得分:0)

第一点很简单,第二点很简单,我假设您希望freq * x的“积分”接近K(从数学上讲,不可能使每个x * freq(x)〜K)。您可以通过调整样本大小来做到这一点。

第一步:在ab之间的钟形曲线整数,使用scipy.stats.truncnorm。从文档中:

  

注释

     

此分布的标准形式是被截断为[a,b]范围的标准正态---注意a和b是在   标准法线的范围。转换剪辑的值   具体平均值和标准偏差,请使用:

a, b = (myclip_a - my_mean) / my_std, (myclip_b - my_mean) / my_std

在-3,3范围内取法线,因此曲线很好。调整均值和标准差,使-3,3变为a,b:

from scipy.stats import truncnorm
a, b = 10, 200
loc = (a + b) / 2
scale = (b - a) / 6
n = 100
f = truncnorm(-3,3, loc=(a+b)/2,scale=(b-a)/6)

现在,由于频率与概率密度函数有关:sum(freq(i)* i)〜n * sum(pdf(i)* i)。因此,n = K / sum(pdf(i)* i)。可以这样获得:

K = 200000
i = np.arange(a, b +1)
n = int(K / i.dot(f.pdf(i)))

现在生成整数随机样本,并检查函数:

samples = f.rvs(size=n).astype(np.int)
import matplotlib.pyplot as plt
plt.hist(samples, bins = 20)
print(np.histogram(samples, bins=b-a+1)[0].dot(np.arange(a,b+1)))

>> 200315

enter image description here