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

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

  • Нормализовать данные → PCA → обучение
  • PCA → нормализовать выход PCA → обучение
  • Нормализовать данные → PCA → нормализовать выход PCA → обучение

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

Ответы

Ответ 1

Вы должны нормализовать данные перед выполнением 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

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

Ответ 2

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