Python:按钟形顺序生成正态分布

时间:2018-06-24 18:27:04

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

我想按钟形生成正态分布。 我使用以下代码生成数字:

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

中提出的代码

,但数字未遵循响铃形式。 有任何想法吗? 非常感谢

2 个答案:

答案 0 :(得分:2)

您可能会混淆的几件事。

random.normal从钟形曲线中随机抽取n个数字

因此,您有1000个数字,每个数字都是从曲线绘制的。要重新创建曲线,您需要应用一些合并。每个面元中的点数将重新生成曲线(仅一个点本身很难代表概率)。在仅1000点的x向量上使用大量的分箱:

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

并将h绘制为hx的函数(因此,我将千个数字分组到50个bin中,y轴将显示这些bin中的点数: enter image description here

现在,我们可以看到x是从钟形分布中抽出的-跌落到中央垃圾箱的机会由高斯确定。这是一个抽样,因此每个点当然都会有所不同-您使用的点越多,装箱越精细,效果越好(更平滑)。

y = normal(x,mu,sigma)

这只是评估给定x处的高斯,因此,实际上,向normal提供任何均值(mu)左右的数字列表,它将精确计算出钟形曲线(准确概率) 。将您的yx作图(您的x本身就是高斯,这并不重要,但是均值周围有1000点,因此可以重新创建函数): enter image description here

看看那有多光滑?那是因为它不是采样,而是函数的精确计算。您可能只使用了0周围的1000个点,看起来就一样好。

答案 1 :(得分:0)

您的代码可以正常工作。

import numpy as np
import matplotlib.pyplot as plt

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) 
y = normal(x,mu,sigma) 


plt.plot(x,y)

enter image description here