我有一个非常大的数据集,我需要用于分类目的 . 但是当我尝试在MatLab中使用它时,我会得到并且 out of memory
错误 . 为了解决这个问题,我试着研究PCA,因为这是解决这些问题的预期解决方案 .
因此,为了更好地理解PCA并确保我可以交替使用PCA和原始数据产生的结果,我想从PCA分数和系数中重现原始数据集 .
我使用以下代码获取PCA分数和系数,然后将其更改回原始数据集 .
%all_feats is the original dataset of size 128 x 19882
[n m] = size(double(all_feats));
Amean = mean(double(all_feats));
Astd = std(double(all_feats));
B = zscore(double(all_feats)); %standardise the data
[COEFF,testy] = pca(B, 'NumComponents',2); %This does not reproduce the same result
%[COEFF,testy] = pca(B); %This works ok, but with values > 0
back = ((B * COEFF) * COEFF') .* repmat(Astd,[n 1]) + repmat(Amean,[n 1]);
我发现当我使用 [COEFF,testy] = pca(B);
时, back
与 all_feats
相同,但原始数据集中的所有 0
都被替换为极小的值,如 3.517186542012496e-13
. 我认为,因为它们很小,所以它们也可以用于其他目的 . 但有什么方法可以解决这个问题吗?比如获得相同的数据 .
此外,如果我想通过使用 [COEFF,testy] = pca(B, 'NumComponents',2);
将尺寸缩小到2,那么 back
看起来就像 all_feats
. 这是为什么?数据是否因尺寸减小而改变?我可以不用它来代替原始数据集吗?
1 回答
降维技术 lose 信息 . 你 cannot 重现你的初始数据,只有它的"approximation" . 实际上这可以看作是一种 compression . 与有损压缩技术类似 - 您无法恢复确切的原始数据 .