通过PCA降维后无法还原原始数据

我有一个非常大的数据集,需要用于分类目的。但当我在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);时,backall_feats相同,但原始数据集中的所有0都被替换为非常小的值,如3.517186542012496e-13。我认为由于它们非常小,在其他用途中可能可以视为0。但有没有办法解决这个问题?比如得到完全相同的数据?

另外,如果我想通过使用[COEFF,testy] = pca(B, 'NumComponents',2);将维度减少到2,那么back看起来与all_feats完全不同。这是为什么?数据在降维过程中是否发生了变化?我不能用它代替原始数据集吗?


回答:

降维技术会丢失信息。你无法重现你的初始数据,只能得到它的“近似值”。实际上,这可以被视为一种压缩。与有损压缩技术类似——你无法恢复完全原始的数据。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注