我想按铃的顺序产生正态分布。
我用这个代码来生成数字:

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

这是在:Generating normal distribution in order python, numpy
但数字并不是按钟形排列的。
有什么想法吗?
非常感谢你

最佳答案

有几件事你很困惑。
随机。从钟形曲线中随机绘制n个数
所以你有1000个数字,每个都是不同的,都是从曲线上画出来的。要重新创建曲线,需要应用一些binning。每个箱子中的点数将重新创建曲线(单点本身很难表示概率)。在1000个点的向量上使用一些广泛的binning:

h,hx=np.histogram(x,bins=50)

并将x绘制为h的函数(所以我将你的几千个数字分成50个容器,hx轴将显示容器中的点的数量:
python - Python:按钟形顺序生成正态分布-LMLPHP
现在我们可以看到,y是从钟形分布中画出来的,落入中央仓的几率由高斯分布决定。这是一个采样,所以每个点可能会有一点变化-使用的点越多,binning越细,它就越好(更平滑)。
x
这只是计算任意给定值下的高斯分布,所以实际上,在平均值(mu)附近提供任意数字列表y = normal(x,mu,sigma),它将精确计算钟形曲线(确切的概率)。绘制xnormal的对比图(您的y本身是高斯的并不重要,但它是平均值周围的1000点,因此它可以重新创建函数):
python - Python:按钟形顺序生成正态分布-LMLPHP
看那有多光滑?那是因为它不是抽样,而是函数的精确计算你可以在0附近使用1000点,看起来也一样好。

10-08 06:41