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

问题描述 投票:3回答:2

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

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

但数字不符合钟形。有任何想法吗?非常感谢你

python python-3.x normal-distribution
2个回答
2
投票

你有些困惑的事情。

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

因此,您有1000个数字,每个数字都不同,全部来自曲线。要重新创建曲线,您需要应用一些分级。每个bin中的点数量将重新创建曲线(单个点本身几乎不能代表概率)。在你的x矢量上使用一些广泛的binning只有1000点:

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

并且将h绘制为hx的函数(因此我将您的一千个数字分组为50个区间,y轴将显示区域中的点数:enter image description here

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

y = normal(x,mu,sigma)

这只是在任何给定的x上评估高斯,所以实际上,为normal提供围绕你的平均值(mu)的任何数字列表,它将精确地计算钟形曲线(确切的概率)。绘制你的yx(无论你的x本身是高斯,但它是平均值的1000点,所以它可以重新创建函数):enter image description here

看看它有多顺畅?那是因为它不是一个采样,它是一个精确的函数计算。你可以在0附近使用任何1000点,它看起来一样好。


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

© www.soinside.com 2019 - 2024. All rights reserved.