PCA先还是归一化先?

23

在进行回归或分类时,预处理数据的正确(或更好)方法是什么?

  1. 标准化数据 -> PCA -> 训练
  2. PCA -> 标准化PCA输出 -> 训练
  3. 标准化数据 -> PCA -> 标准化PCA输出 -> 训练

上述哪种方法更为正确,或者说是预处理数据的“标准”方式?在“标准化”中,我指的是标准化、线性缩放或其他一些技术。

5个回答

28

在执行PCA之前,应该对数据进行规范化。例如,考虑以下情况。我创建了一个带有已知相关矩阵C的数据集X

>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;

如果我现在执行PCA,我会正确地发现主成分(权重向量的行)与坐标轴呈角度方向:

>> wts=pca(X)
wts =
    0.6659    0.7461
   -0.7461    0.6659
如果我现在将数据集的第一个特征放大100倍,直觉上我们认为主成分不应该改变:
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);

然而,我们现在发现主成分与坐标轴对齐:

>> wts=pca(Y)
wts =
    1.0000    0.0056
   -0.0056    1.0000
为了解决这个问题,有两个选择。第一种是我可以重新调整数据的比例:
>> Ynorm = bsxfun(@rdivide,Y,std(Y))

(在Matlab中,使用奇怪的bsxfun符号进行向量矩阵运算 - 我所做的就是减去每个特征的平均值并除以标准差)。

现在我们从PCA中得到了明智的结果:

>> wts = pca(Ynorm)
wts =
   -0.7125   -0.7016
    0.7016   -0.7125

它们与原始数据上的PCA略有不同,因为现在我们已经确保我们的特征具有单位标准差,这在最初并非如此。

另一个选择是使用数据的相关矩阵而不是外积进行PCA:

>> wts = pca(Y,'corr')
wts =
    0.7071    0.7071
   -0.7071    0.7071

实际上,这与通过减去平均值然后除以标准差来标准化数据完全等价。这只是更方便而已。在我看来,除非你有一个充分的理由不这样做(例如,如果您想要捕捉每个特征的变化差异),否则您应该始终这样做。


在进行PCA之前,您应该对数据进行归一化。是归一化还是标准化或两者都可以?如果不是标准化,为什么不是?谢谢。 - DPM

7

首先,你需要始终对数据进行归一化处理。否则,PCA或其他用于降低维度的技术将产生不同的结果。


0

首先对数据进行归一化处理。实际上,一些 R 包在执行 PCA 分析之前会自动归一化数据,这些包非常有用。如果变量具有不同的单位或描述不同的特征,则必须进行归一化处理。


0

答案是第三个选项,因为在进行PCA后,我们必须对PCA输出进行归一化处理,因为整个数据的标准将完全不同。我们必须在进行PCA之前和之后对数据集进行归一化处理,这将更加准确。


-1

我在PCA目标函数中又发现了一个原因。 你可以在这个链接中看到详细信息 输入链接描述 假设在进行PCA之前,X矩阵已经被归一化。


请提供详细的解释以便下一个用户更好地理解您的答案。同时,为了防止链接在未来失效,请简要介绍链接内容。 - Elydasian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接