Сначала PCA или нормализация?

при выполнении регрессии или классификации, каков правильный (или лучший) способ предварительной обработки данных?

  1. нормализовать данные - > PCA - > обучение
  2. PCA - > нормализовать выход PCA - > обучение
  3. нормализовать данные - > PCA - > нормализовать вывод PCA - > обучение

какой из вышеперечисленных является более правильным или" стандартизированным " способом предварительной обработки данных? Под "нормализацией" я имею в виду стандартизацию, линейное масштабирование или некоторые другой метод.

2 ответов


вы должны нормализовать данные перед выполнением PCA. Например, рассмотрим следующую ситуацию. Я создаю набор данных X С известной корреляционной матрицы C:

>> 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

на самом деле это полностью эквивалентно стандартизации данных вычитанием среднего и делением на стандартное отклонение. Это просто удобнее. По-моему, вы должны всегда сделайте это, если у вас нет веской причины не делать (например, если вы хочу чтобы подобрать различия в изменении каждой функции).


сначала необходимо нормализовать данные всегда. В противном случае PCA или другие методы, используемые для уменьшения размеров, дадут разные результаты.