我有一个非常大的数据集,我需要将其用于分类目的。但是当我尝试在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
都已替换为极小的值,例如{ {1}}。我认为,因为它们很小,所以它们也可以用于其他目的。但有什么方法可以解决这个问题吗?比如获得相同的数据。
此外,如果我想使用3.517186542012496e-13
将尺寸缩小为2,那么[COEFF,testy] = pca(B, 'NumComponents',2);
看起来就像back
。这是为什么?数据是否因尺寸减小而改变?我可以不用它来代替原始数据集吗?
答案 0 :(得分:3)
降维技术丢失信息。你不能重现你的初始数据,只有它的“近似值”。实际上,这可以被视为一种压缩。与有损压缩技术类似 - 您无法恢复确切的原始数据。