如何移除高斯功率曲线绘图中的边缘点?
移除高斯混合模型等高线图边缘值的实现方法
你需要生成二维高斯混合模型的概率密度等高线图并移除绘图中的边缘极值/低密度区域,以下是两种直接适配你现有代码的解决方案:
方法一:基于概率密度阈值过滤
直接对计算得到的概率密度矩阵Z设置阈值,将低于阈值的区域置为NaN,绘图时这些区域会被自动忽略。
修改代码中Z = exp(Z);之后的部分:
Z = exp(Z); % 设置密度阈值,示例取Z的5%分位数作为过滤边界,可按需调整 threshold = prctile(Z(:), 5); Z(Z < threshold) = NaN; % 低于阈值的区域设为NaN,不参与绘图 plot(givenData(:,1),givenData(:,2),'k.','MarkerSize',3);hold on contour(xgrid,ygrid,Z,40); axis tight;
- 说明:分位数数值可灵活调整,比如设为3%会保留更多区域,设为10%则只保留核心高密度区域。
方法二:基于数据范围裁剪网格
通过限制xgrid和ygrid的范围,只保留原始数据的核心分布区间(比如95%置信区间),直接缩小绘图范围排除边缘值。
替换原代码中网格生成及后续绘图的相关部分:
% 基于原始数据计算x、y维度的95%置信区间 x_low = prctile(givenData(:,1), 2.5); x_high = prctile(givenData(:,1), 97.5); y_low = prctile(givenData(:,2), 2.5); y_high = prctile(givenData(:,2), 97.5); % 提取核心范围内的网格点 x_core = xmesh{1}(xmesh{1} >= x_low & xmesh{1} <= x_high); y_core = xmesh{2}(xmesh{2} >= y_low & xmesh{2} <= y_high); [xgrid,ygrid] = meshgrid(x_core(2:end-1), y_core(2:end-1)); % 裁剪对应区域的Z矩阵 [x_idx, ~] = ismember(x_core(2:end-1), xmesh{1}(2:end-1)); [y_idx, ~] = ismember(y_core(2:end-1), xmesh{2}(2:end-1)); Z = Z(y_idx, x_idx); plot(givenData(:,1),givenData(:,2),'k.','MarkerSize',3);hold on contour(xgrid,ygrid,Z,40); axis([x_low x_high y_low y_high]); % 强制锁定坐标轴范围
- 说明:这种方式从数据分布根源上排除边缘区域,适合需要严格限制绘图范围的场景。
额外优化提示
- 若使用方法一,可结合等高线层级控制,比如只绘制高于阈值的等高线,将
contour(xgrid,ygrid,Z,40)替换为contour(xgrid,ygrid,Z, linspace(threshold, max(Z(:)), 20)),仅保留20条核心等高线。 - 注意
eps的使用:计算marginalLogLikelihood_grid时,log(pdensity{k}(2:end-1)+eps)可避免对数负无穷,但如果pdensity已被置0,需注意避免引入不必要的噪声。
内容的提问来源于stack exchange,提问作者Arjun Krishnan
相关产品推荐
相关产品推荐

