为何输入数据不同时,我的等高线图呈现差异?
多变量正态分布等高线图异常问题
问题背景
基于多个二维点的多变量正态分布概率密度函数(PDF)叠加生成等高线图时,不同数据集表现出异常:
- 第一组数据集:出现不明黑线,伴随巨大圆形轮廓
- 第二组数据集:表现正常
- 第三组数据集:仅显示3层等高线(代码中设置为5层)
复现代码
import numpy as np import matplotlib.pyplot as plt from scipy.stats import multivariate_normal # 第一组数据集 data_1=[8.58 ,8.584 ,8.569 ,8.538] data_2=[119.614, 119.633, 119.697, 119.96 ] # 第二组数据集(取消注释可切换) #data_1=[8.601 ,8.605 ,8.607 ,8.624] #data_2=[120.976 ,120.988 ,120.961, 120.988] # 第三组数据集(取消注释可切换) #data_1=[8.901, 8.907 ,8.902, 8.89 ] #data_2= [121.547, 121.56, 121.547 ,121.514] x_axis=np.linspace((min(data_1)-0.01),(max(data_1)+0.01),100) y_axis=np.linspace((min(data_2)-0.01),(max(data_2)+0.01),100) spread=[[2e-6, 1e-9], [1e-9, 2e-6]] x,y=np.meshgrid(x_axis,y_axis) pos=np.dstack((x,y)) pdf_sum=np.zeros_like(x) for points in np.stack((data_1,data_2),axis=-1): pdf_sum+=(multivariate_normal(points,spread)).pdf(pos) plt.contour(x,y,pdf_sum,levels=5,colors='black') plt.show()
异常现象说明
- 第一组:图中出现贯穿性不明黑线,同时存在覆盖大范围的巨大圆形轮廓,推测黑线由该大圆圈导致
- 第二组:正常显示5层等高线,符合代码设置
- 第三组:仅渲染出3层等高线,与
levels=5的设置不符
原因分析与修复方案
核心问题
- 数据尺度与协方差不匹配:第一组数据中
data_2的取值范围(119.614119.96)远大于`data_1`(8.5388.584),但协方差矩阵spread给两个维度设置了相同的极小方差,导致y轴方向的正态分布被极度拉伸,生成覆盖整个绘图区域的超大轮廓,表现为黑线。 - 自动分层逻辑限制:第三组数据的PDF叠加后数值差异较小,matplotlib的自动分层算法无法识别出5个有效差异区间,仅能生成3层等高线。
修复方案
- 匹配数据尺度调整协方差:根据数据的实际范围设置对应维度的协方差,避免分布过度拉伸:
x_range = max(data_1) - min(data_1) y_range = max(data_2) - min(data_2) # 将方差设为对应维度数据范围1/10的平方,适配数据尺度 spread = [[(x_range/10)**2, 0], [0, (y_range/10)**2]] - 手动指定等高线层级:绕过自动分层,基于PDF的实际数值范围手动生成5个层级:
pdf_min = pdf_sum.min() pdf_max = pdf_sum.max() levels = np.linspace(pdf_min, pdf_max, 5) plt.contour(x, y, pdf_sum, levels=levels, colors='black') - 标准化数据消除尺度差异:对两组数据做标准化处理,统一尺度后再生成分布:
data_1 = (np.array(data_1) - np.mean(data_1)) / np.std(data_1) data_2 = (np.array(data_2) - np.mean(data_2)) / np.std(data_2)
内容的提问来源于stack exchange,提问作者samman
相关产品推荐
相关产品推荐

