首先是PCA还是标准化?

时间:2012-04-12 08:20:56

标签: machine-learning normalization classification regression pca

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

  1. 规范化数据 - > PCA - >训练
  2. PCA - >标准化PCA输出 - >训练
  3. 规范化数据 - > PCA - >标准化PCA输出 - >训练
  4. 以上哪项更正确,还是预处理数据的“标准化”方式? “标准化”是指标准化,线性缩放或其他一些技术。

5 个答案:

答案 0 :(得分:25)

您应该在执行PCA之前规范化数据。例如,请考虑以下情况。我创建了一个数据集X,其中包含已知的相关矩阵C

>> 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))

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

我们现在从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

实际上,这完全等同于通过减去平均值然后除以标准偏差来标准化数据。它更方便。在我看来,你应该总是这样做,除非你有充分的理由不这样做(例如,如果你希望获取每个特征变化的差异)。

答案 1 :(得分:6)

您需要先将数据标准化始终。否则,PCA或用于减小尺寸的其他技术将产生不同的结果。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我在 PCA 目标函数中有另一个原因。 您可以在此链接中看到详细信息吗 enter link description here 假设 X 矩阵在 PCA 之前已经归一化。