为何我生成的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
相关产品推荐
相关产品推荐

