在进行回归或分类时,预处理数据的正确(或更好)方法是什么?
标准化data -> PCA ->训练
PCA ->归一化PCA输出->训练
归一化数据-> PCA ->归一化PCA输出->训练
以上哪一项更正确,还是预处理数据的“标准化”方法?所谓“标准化”,我指的是标准化、线性缩放或其他一些技术。
发布于 2012-04-12 16:56:00
在进行PCA之前,您应该对数据进行归一化。例如,考虑以下情况。我创建了一个数据集
具有已知的相关矩阵
>> 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中,符号是用来做向量矩阵算术的--我所做的就是减去平均值,再除以每个特征的标准差)。
我们现在从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
实际上,这完全等同于通过减去平均值,然后除以标准差来标准化数据。只是更方便而已。在我看来,你应该
始终
除非你有很好的理由不这样做(例如,如果你
想要
以拾取每个特征的变化中的差异)。
发布于 2012-04-12 16:26:49
您需要先对数据进行规范化
始终
..。否则,PCA或其他用于降维的技术将给出不同的结果。
发布于 2020-04-05 12:29:14
首先对数据进行规范化。实际上,一些用于执行PCA分析的R包在执行PCA之前会自动对数据进行归一化。如果变量具有不同的单位或描述不同的特征,则必须进行标准化。
https://stackoverflow.com/questions/10119913
复制相似问题