我有一个非常大的数据集,需要用于分类目的。但当我在MatLab中尝试使用它时,会得到一个out of memory
错误。为了解决这个问题,我尝试研究了PCA,因为这是解决此类问题的预定解决方案。
为了更好地理解PCA,并确保我可以将PCA产生的结果与原始数据互换使用,我想从PCA的得分和系数中重现原始数据集。
我使用以下代码获取PCA的得分和系数,然后将其转换回原始数据集。
%all_feats是大小为128 x 19882的原始数据集[n m] = size(double(all_feats));Amean = mean(double(all_feats));Astd = std(double(all_feats));B = zscore(double(all_feats)); %标准化数据[COEFF,testy] = pca(B, 'NumComponents',2); %这不会产生相同的结果%[COEFF,testy] = pca(B); %这可以工作,但值> 0back = ((B * COEFF) * COEFF') .* repmat(Astd,[n 1]) + repmat(Amean,[n 1]);
我发现当我使用[COEFF,testy] = pca(B);
时,back
与all_feats
相同,但原始数据集中的所有0
都被替换为非常小的值,如3.517186542012496e-13
。我认为由于它们非常小,在其他用途中可能可以视为0。但有没有办法解决这个问题?比如得到完全相同的数据?
另外,如果我想通过使用[COEFF,testy] = pca(B, 'NumComponents',2);
将维度减少到2,那么back
看起来与all_feats
完全不同。这是为什么?数据在降维过程中是否发生了变化?我不能用它代替原始数据集吗?
回答:
降维技术会丢失信息。你无法重现你的初始数据,只能得到它的“近似值”。实际上,这可以被视为一种压缩。与有损压缩技术类似——你无法恢复完全原始的数据。