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

2024-05-18 21:04:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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中提出的代码

但这些数字并没有遵循钟形结构。 有什么想法吗? 非常感谢


Tags: the代码numpy顺序np数字randomdensity
2条回答

有几件事你很困惑。在

随机。正常从钟形曲线中随机绘制n个数字

你有1000个数字,每个都是不同的,都是从曲线上画出来的。要重新创建曲线,您需要应用一些binning。每个箱子中的点数将重新创建曲线(仅仅一个点本身很难代表一个概率)。在仅包含1000个点的x向量上使用一些扩展的binning:

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

并将h作为hx的函数绘制出来(所以我将你的1000个数字分成50个箱子,y轴将显示这些箱子中的点数: enter image description here

现在我们可以看到x是从一个钟形分布中得出的,落在中心位置的几率是由高斯分布决定的。这是一个采样,因此每个点可能会有一点变化-使用的点越多,分块越细,效果越好(更平滑)。在

y = normal(x,mu,sigma)

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

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

你的代码运行得很好。在

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

相关问题 更多 >

    热门问题