You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我生成的2D高斯分布呈圆形而非椭球形?技术求助

问题排查:2D高斯分布显示为圆形而非椭球形

我来帮你搞定这个问题!首先得明确:你的代码逻辑本身是完全正确的——生成两个独立的一维高斯分布并组合成二维分布,理论上应该是轴对齐的椭球形(因为两个维度独立,协方差矩阵是对角阵)。之所以看起来是圆形,问题出在Matplotlib的坐标轴显示比例上,而非数据本身。

问题根源

你的两个一维分布的标准差差异很大:

  • s1的标准差是0.1,数据范围大约在[-0.3, 0.3](3σ范围)
  • s2的标准差是0.3,数据范围大约在[0.8-0.9, 0.8+0.9] = [-0.1, 1.7]

但plt.hist2d默认会自动调整两个坐标轴的缩放比例,让数据填满整个绘图区域。这就导致x轴(s1)的单位长度在视觉上比y轴(s2)宽很多,原本的椭球被拉伸成了圆形。

解决方案:强制坐标轴等比例显示

只需要在绘制2D直方图后,添加一行代码强制坐标轴使用相同的比例,就能看到预期的椭球形了。

修改后的代码如下:

import numpy as np
import matplotlib.pyplot as plt

mu1, sigma1 = 0, 0.1
s1 = np.random.normal(mu1, sigma1, 10000)
mu2, sigma2 = 0.8, 0.3
s2 = np.random.normal(mu2, sigma2, 10000)

plt.figure(1)
plt.title('Histogram of a 2D-Gaussian Distribution')
plt.hist(s1, 100, alpha=0.5, label='s1')
plt.hist(s2, 100, alpha=0.5, label='s2')
plt.legend()
plt.show()

plt.figure(2)
plt.title('2D-Gaussian Distribution (Equal Aspect Ratio)')
bins = plt.hist2d(s1, s2, 100)
cb = plt.colorbar()
cb.set_label('counts in bin')
# 关键:设置坐标轴等比例
plt.axis('equal')
# 或者用更灵活的方式,适配不同场景:
# plt.gca().set_aspect('equal', adjustable='box')
plt.show()

额外验证小技巧

如果你想快速确认数据的真实形态,可以用散点图辅助验证:

plt.figure(3)
plt.title('Scatter Plot of 2D-Gaussian')
plt.scatter(s1, s2, s=1, alpha=0.2)
plt.axis('equal')
plt.show()

加上等比例设置后,椭球的形状会非常直观。

内容的提问来源于stack exchange,提问作者XaBla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:10:20