如何在MATLAB中将低维PCA投影点还原至原始空间?
嘿,这个问题我之前做PCA可视化后还原数据时也踩过坑,咱们一步步理清楚哈!
首先得先明确你用的MATLAB pca 函数的输出逻辑,再看你的还原代码问题在哪,最后给正确的方法:
1. 先理清你现有PCA代码的逻辑(顺便纠正可能的笔误)
你说X是455样本×30特征的矩阵,但你调用的是 pca(X') ——这里其实有个小问题:MATLAB的pca默认要求输入是样本数×特征数的矩阵(行是样本,列是特征)。如果X是455×30(样本×特征),那X'就是30×455,相当于把30个特征当成了“样本”,455个样本当成了“特征”,这显然和你后续用gscatter(score(:,1),score(:,2),Y)的需求矛盾(Y是455个样本标签,score应该是455行才对)。所以正确的PCA调用应该是:
[coeff, score, ~, ~, ~, mu] = pca(X); % X是455×30,样本×特征
此时:
coeff:30×30的矩阵,每一列是一个主成分正交向量(前2列就是你用来降维的主成分)score:455×30的矩阵,每一行是对应样本在主成分空间的得分(score(:,1:2)就是你画散点图的2D投影)mu:1×30的向量,是原始数据每个特征的均值
2. 你的还原代码为什么无效?
你写的projecte30dz=z*coeff(1:2,:)是错误的,原因有两个:
- 维度逻辑错了:主成分向量是
coeff的列,不是行。coeff(1:2,:)取的是前2行,这完全不是用来还原的主成分方向 - 没考虑均值:PCA降维时是先对原始数据去均值的,还原时必须加回均值才能回到原始数据空间
3. 正确的还原方法
假设你现在的z是n个新样本的2D得分(n×2的矩阵,和score(:,1:2)的格式一致),要还原回30维空间,步骤如下:
步骤1:通过得分还原出去均值的30维数据
利用主成分向量的正交性,我们用得分乘以coeff前2列的转置,得到去均值的高维数据:
X_centered_recon = z * coeff(:,1:2)';
这里coeff(:,1:2)是30×2的矩阵(前2个主成分向量),转置后是2×30,和n×2的z相乘得到n×30的去均值数据。
步骤2:加回均值得到原始空间的30维数据
因为PCA降维前先对数据做了去均值处理,所以还原时必须加回每个特征的均值mu:
X_recon = X_centered_recon + mu;
4. 重要提醒
这种还原是近似还原,因为你只保留了前2个主成分,丢失了剩下28个主成分携带的信息,所以还原后的30维数据和原始数据会有一定误差——误差大小取决于前2个主成分的方差解释率(你可以用explained参数查看,explained(1)+explained(2)就是前2个主成分解释的方差占比)。
内容的提问来源于stack exchange,提问作者havakok

