在python中绘制三维零均值、单位方差高斯会产生意想不到的结果

在python中绘制三维零均值、单位方差高斯会产生意想不到的结果,python,numpy,matplotlib,gaussian,Python,Numpy,Matplotlib,Gaussian,我正在使用零均值和单位方差的numpy绘制一组3D高斯样本: cov = np.zeros((3,3), dtype=np.float32) np.fill_diagonal(cov, 1.0) data_values = np.random.multivariate_normal([0.,0.,0.], cov, size=5000) # 5000 x 3 我能画出每个维度,看到高斯分布 我无法绘制完整的3D高斯曲线,因此为了验证,我计算了数据值中每个样本与原点的距离(0,0,0)

我正在使用零均值和单位方差的numpy绘制一组3D高斯样本:

cov =  np.zeros((3,3), dtype=np.float32)
np.fill_diagonal(cov, 1.0)
data_values = np.random.multivariate_normal([0.,0.,0.], cov, size=5000)  # 5000 x 3
我能画出每个维度,看到高斯分布

我无法绘制完整的3D高斯曲线,因此为了验证,我计算了
数据值中每个样本与原点的距离
(0,0,0)

当我绘制距离直方图时,我希望看到半高斯分布,模式为零,但我没有


有人能看到错误,或者解释结果吗?

距离中心的分布不是半高斯分布。例如,在二维中,分布是(的一个特例)

这里有一个快速的解释,使用协方差矩阵是恒等式的简单例子,说明您应该期望分布是什么。然后三维高斯分布的PDF看起来像
K*exp(-x.dot(x)/2)
,其中
K
1/(2*pi)**(1.5)
。重写
x.dot(x)
r**2
r
是距离原点的距离。因此PDF的行为类似于
K*exp(-r**2/2)

现在想象一个围绕原点的球形薄壳,半径
r
,厚度
dr
。这个薄壳的“体积”大约为
4*pi*r**2*dr
。整个体积必须包含在距离原点的距离分布中。因此我们将高斯PDF(表示为
r
的函数)乘以这个球壳的体积,然后除以
dr
,得到密度作为
r
的函数。这就给出了
(2*r**2)/sqrt(2*pi)*exp(-r**2/2)
。(此分布称为。)

这是距离直方图的图,以及
r
的函数:

直方图是使用

hist(dist_from_center, bins=25, normed=True)
hist(dist_from_center, bins=25, normed=True)