您应该在进行 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))
(奇怪的 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
实际上这完全等同于通过减去均值再除以标准差来标准化数据。只是更方便。在我看来,您应该始终这样做,除非您有充分的理由不这样做(例如,如果您想要了解每个功能的变化差异)。