Python:按铃声顺序生成正态分布

Dri*_*ssi 5 python normal-distribution python-3.x

我想按照铃声的顺序生成正态分布。我使用此代码来生成数字:

import numpy as np

mu,sigma,n = 0.,1.,1000

def normal(x,mu,sigma):
    return ( 2.*np.pi*sigma**2. )**-.5 * np.exp( -.5 * (x-mu)**2. / sigma**2. )

x = np.random.normal(mu,sigma,n) #generate random list of points from normal distribution
y = normal(x,mu,sigma) #evaluate the probability density at each point
x,y = x[np.argsort(y)],np.sort(y) #sort according to the probability density
Run Code Online (Sandbox Code Playgroud)

这是中提出的代码:按顺序生成正态分布 python,numpy

但数字并不遵循钟形。有任何想法吗?非常感谢

kab*_*nus 3

有几件事让你感到困惑。

nrandom.normal从钟形曲线中随机抽取数字

因此,您有 1000 个数字,每个数字都不同,全部从曲线中绘制。要重新创建曲线,您需要应用一些分箱。每个箱中的点数将重新创建曲线(仅单个点本身很难代表概率)。x对仅包含 1000 个点的向量使用一些广泛的分箱:

h,hx=np.histogram(x,bins=50)
Run Code Online (Sandbox Code Playgroud)

并绘制h为函数hx(因此我将您的一千个数字分为 50 个箱,y轴将显示箱中的点数: 在此输入图像描述

现在我们可以看到x它是从钟形分布中得出的 - 落入中心箱的机会由高斯决定。这是一个采样,因此每个点当然可能会有所不同 - 您使用的点越多,分箱越精细,效果就越好(更平滑)。

y = normal(x,mu,sigma)

这只是评估任何给定 处的高斯分布x,因此实际上,提供normal平均值 (mu) 周围的任何数字列表,它将准确计算钟形曲线(确切的概率)。绘制你的y对照图x(你的本身是高斯分布并不重要x,但它是平均值周围的 1000 个点,所以它可以重新创建函数): 在此输入图像描述

看看那有多光滑?这是因为它不是采样,而是函数的精确计算。您可以使用 0 附近的任何 1000 个点,看起来也一样好。