首先是PCA还是标准化?

Ala*_*anS 19 regression classification machine-learning normalization pca

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

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

以上哪一项更正确,还是预处理数据的"标准化"方式?"标准化"是指标准化,线性缩放或其他一些技术.

Chr*_*lor 25

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

>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
Run Code Online (Sandbox Code Playgroud)

如果我现在执行PCA,我正确地发现主要组件(权重向量的行)与坐标轴成一定角度:

>> wts=pca(X)
wts =
    0.6659    0.7461
   -0.7461    0.6659
Run Code Online (Sandbox Code Playgroud)

如果我现在将数据集的第一个特征缩放100,我们直观地认为主要组件不应该改变:

>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
Run Code Online (Sandbox Code Playgroud)

但是,我们现在发现主要组件与坐标轴对齐:

>> wts=pca(Y)
wts =
    1.0000    0.0056
   -0.0056    1.0000
Run Code Online (Sandbox Code Playgroud)

要解决此问题,有两种选择.首先,我可以重新调整数据:

>> Ynorm = bsxfun(@rdivide,Y,std(Y))
Run Code Online (Sandbox Code Playgroud)

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

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

>> wts = pca(Ynorm)
wts =
   -0.7125   -0.7016
    0.7016   -0.7125
Run Code Online (Sandbox Code Playgroud)

它们与原始数据上的PCA略有不同,因为我们现在保证我们的功能具有单位标准偏差,而原始情况并非如此.

另一种选择是使用数据的相关矩阵而不是外部产品来执行PCA:

>> wts = pca(Y,'corr')
wts =
    0.7071    0.7071
   -0.7071    0.7071
Run Code Online (Sandbox Code Playgroud)

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


Ati*_*gur 7

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