如何在Matlab的GMCM中仅绘制外部轮廓线?
调整GMCM二维轮廓图函数以仅显示外部轮廓线
要实现仅显示GMCM(高斯混合Copula模型)的外部轮廓线,核心是调整contour函数的轮廓水平参数——原代码用最小值和最大值组合会画出多余内层轮廓,我们需要选择对应数据分布边缘的概率阈值来生成单一外部轮廓。
修改步骤:
1. 替换轮廓水平的计算逻辑
原代码直接取Z的最小、最大值作为轮廓水平,不符合需求。我们改为计算Z的低百分位数(比如5%,可根据数据调整),这个阈值对应分布的边缘区域,刚好能包围大部分数据点。
替换原代码中的:
min_level = min(min(Z)) max_level = max(max(Z))
为:
% 选择对应外部轮廓的概率阈值,这里取Z的5%分位数(可按需调整) contour_level = prctile(Z(:), 5);
2. 修改contour函数调用
只使用上述计算的单一阈值绘制轮廓,去掉内层的最大值轮廓:
替换原代码中的:
contour(xgrid,ygrid,Z,'LevelList',[min_level, max_level],'EdgeColor',[1 0 0]);
为:
contour(xgrid,ygrid,Z,'LevelList',contour_level,'EdgeColor',[1 0 0]);
3. 可选:调整阈值控制轮廓紧密程度
如果觉得轮廓太松或太紧,可修改百分位数数值:
- 百分位数越小(比如2%),轮廓范围越大,能包围更多边缘点
- 百分位数越大(比如10%),轮廓范围越小,更贴近数据核心
完整修改后的关键代码片段:
Z = exp(Z); % 计算外部轮廓对应的阈值(5%分位数) contour_level = prctile(Z(:), 5); plot(givenData(:,1),givenData(:,2),'b.','MarkerSize',3);hold on % 仅绘制单一外部轮廓线 contour(xgrid,ygrid,Z,'LevelList',contour_level,'EdgeColor',[1 0 0]); axis tight;
原理说明
GMCM的似然值Z在数据密集区域数值高,边缘区域数值低。通过选择低百分位数的Z值作为轮廓水平,我们能得到刚好包围大部分数据点的外部边界,而非原代码中包含的核心区域(最大值)和超大范围(最小值)的双重轮廓。
内容的提问来源于stack exchange,提问作者Arjun Krishnan
相关产品推荐
相关产品推荐

