MATLAB中PCA 3D置信椭球显示为2D椭圆的修复方法问询
MATLAB 3D PCA散点图置信椭球变2D椭圆的问题修复
问题原因
导致3D场景下置信椭球变成2D椭圆的核心原因通常有以下几点:
- 椭球计算未纳入第三维信息:多数简易椭球实现只针对2D场景,仅提取前两个主成分的协方差矩阵,完全忽略第三维的变异数据,导致椭球在Z轴方向被压缩成平面。
- 网格采样仅覆盖XY平面:生成椭球表面点时,只在XY平面生成网格,未对第三主成分对应的Z轴进行角度或维度扩展,最终输出平面图形。
- PCA降维维度错误:若PCA后仅保留前2个主成分,强行在3D图中绘制时第三维数值固定(通常为0),自然呈现2D椭圆形态。
修复方案(完整可运行代码)
假设已完成PCA分析,得到3维降维数据pca_data(n×3矩阵,n为样本数),以及样本类别标签labels,以下是生成正确3D置信椭球的代码:
% 初始化绘图 figure; hold on; grid on; view(3); % 定义类别颜色 class_colors = ['r', 'g', 'b']; % 获取所有唯一类别 unique_classes = unique(labels); for idx = 1:length(unique_classes) % 提取当前类别的PCA数据 current_data = pca_data(labels == unique_classes(idx), :); % 计算类别均值与3×3协方差矩阵 class_mean = mean(current_data); class_cov = cov(current_data); % 绘制类别散点 scatter3(current_data(:,1), current_data(:,2), current_data(:,3), 40, class_colors(idx), 'filled'); % 计算95%置信度对应的卡方临界值(3个维度,自由度为3) conf_threshold = chi2inv(0.95, 3); % 协方差矩阵特征值分解,获取主轴方向与长度 [eig_vec, eig_val] = eig(class_cov); % 生成3D球面网格点,转换为椭球 [theta, phi] = meshgrid(linspace(0, 2*pi, 50), linspace(0, pi, 50)); x_sphere = sqrt(conf_threshold * eig_val(1,1)) * cos(theta) .* sin(phi); y_sphere = sqrt(conf_threshold * eig_val(2,2)) * sin(theta) .* sin(phi); z_sphere = sqrt(conf_threshold * eig_val(3,3)) * cos(phi); % 坐标转换:从主轴坐标系转到PCA坐标系,再平移到类别均值位置 ellipsoid_coords = [x_sphere(:), y_sphere(:), z_sphere(:)] * eig_vec'; ellipsoid_coords = ellipsoid_coords + repmat(class_mean, size(ellipsoid_coords,1), 1); % 重新整理为网格并绘制半透明椭球 x_ell = reshape(ellipsoid_coords(:,1), size(theta)); y_ell = reshape(ellipsoid_coords(:,2), size(theta)); z_ell = reshape(ellipsoid_coords(:,3), size(theta)); mesh(x_ell, y_ell, z_ell, 'FaceColor', class_colors(idx), 'FaceAlpha', 0.2, 'EdgeColor', 'none'); end % 图形标注 legend('类别1', '类别2', '类别3'); xlabel('主成分1'); ylabel('主成分2'); zlabel('主成分3'); title('3D PCA散点图与95%置信椭球');
核心修复细节
- 协方差矩阵维度校验:确保
current_data是n×3的矩阵,cov(current_data)生成3×3的协方差矩阵,包含三个维度的变异信息。 - 卡方自由度匹配:3D椭球对应3个维度,需使用
chi2inv(0.95, 3)(临界值约7.81),而非2D场景的chi2inv(0.95, 2)(5.99)。 - 3D网格生成:通过
theta(方位角)和phi(极角)生成完整的球面网格,确保椭球在三个维度都有扩展,而非仅XY平面。 - PCA维度确认:执行PCA时需保留前3个主成分,例如使用
[coeff, score, latent] = pca(data, 'NumComponents', 3);,其中score即为3维的pca_data。
内容的提问来源于stack exchange,提问作者STEMQs
相关产品推荐
相关产品推荐

