Ala*_*anS 19 regression classification machine-learning normalization 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)
实际上,这完全等同于通过减去平均值然后除以标准偏差来标准化数据.它更方便.在我看来,你应该总是这样做,除非你有充分的理由不去(例如,如果你想要了解每个特征的变化差异).