在进行回归或分类时,预处理数据的正确(或更好)方法是什么?
- 标准化数据 -> PCA -> 训练
- PCA -> 标准化PCA输出 -> 训练
- 标准化数据 -> PCA -> 标准化PCA输出 -> 训练
上述哪种方法更为正确,或者说是预处理数据的“标准”方式?在“标准化”中,我指的是标准化、线性缩放或其他一些技术。
在进行回归或分类时,预处理数据的正确(或更好)方法是什么?
上述哪种方法更为正确,或者说是预处理数据的“标准”方式?在“标准化”中,我指的是标准化、线性缩放或其他一些技术。
在执行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或其他用于降低维度的技术将产生不同的结果。
首先对数据进行归一化处理。实际上,一些 R 包在执行 PCA 分析之前会自动归一化数据,这些包非常有用。如果变量具有不同的单位或描述不同的特征,则必须进行归一化处理。
答案是第三个选项,因为在进行PCA后,我们必须对PCA输出进行归一化处理,因为整个数据的标准将完全不同。我们必须在进行PCA之前和之后对数据集进行归一化处理,这将更加准确。
我在PCA目标函数中又发现了一个原因。 你可以在这个链接中看到详细信息 输入链接描述 假设在进行PCA之前,X矩阵已经被归一化。