Вы должны нормализовать данные перед выполнением 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
Фактически это полностью эквивалентно стандартизации данных путем вычитания среднего значения и последующего деления на стандартное отклонение. Это просто удобнее. На мой взгляд, вы должны всегда делать это, если только у вас нет веских причин не делать этого (например, если вы хотите выявить различия в вариациях каждой функции).
person
Chris Taylor
schedule
12.04.2012