Анализ главных компонент Matlab (порядок собственных значений) - PullRequest
0 голосов
/ 14 февраля 2011

Я хочу использовать функцию "princomp" Matlab, но эта функция выдает собственные значения в отсортированном массиве. Таким образом, я не могу узнать, какому столбцу соответствует какое собственное значение. Для Matlab

m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);

совпадает с

m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);

То есть замена первых двух столбцов ничего не меняет. Результат (собственные значения) в скрытом виде будет: (27,0,0) Информация (собственное значение которой соответствует исходному (входному) столбцу) теряется. Есть ли способ сказать Matlab, чтобы не сортировать собственные значения?

Ответы [ 2 ]

16 голосов
/ 15 февраля 2011

При использовании PCA каждый возвращаемый основной компонент будет представлять собой линейную комбинацию исходных столбцов / размеров.Возможно, пример может устранить любое недопонимание, которое у вас есть.

Давайте рассмотрим набор данных Fisher-Iris, состоящий из 150 экземпляров и 4 измерений, и применим PCA к данным.Чтобы упростить понимание, я сначала центрирую данные по нулю перед вызовом функции PCA:

load fisheriris
X = bsxfun(@minus, meas, mean(meas));    %# so that mean(X) is the zero vector

[PC score latent] = princomp(X);

Давайте посмотрим на первый возвращенный главный компонент (1-й столбец PC матрицы):

>> PC(:,1)
      0.36139
    -0.084523
      0.85667
      0.35829

Это выражается в виде линейной комбинации исходных размеров, то есть:

PC1 =  0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4

Следовательно, чтобы выразить те же данные в новой системе координат, образованной главными компонентами, в новом первом измерениидолжна быть линейной комбинацией исходных в соответствии с приведенной выше формулой.

Мы можем вычислить это просто как X*PC, который является именно тем, что возвращается во втором выводе PRINCOMP (score), чтобыподтвердите эту попытку:

>> all(all( abs(X*PC - score) < 1e-10 ))
    1

Наконец, важность каждого основного компонента может быть определена тем, насколько сильно разброс данных объясняется.Это возвращается третьим выходом PRINCOMP (latent).


Мы можем сами вычислить PCA данных без использования PRINCOMP:

[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);

собственных векторовковариационные матрицы V являются основными компонентами (как и PC выше, хотя знак может быть инвертирован), а соответствующие собственные значения E представляют величину объясненной дисперсии (так же, как latent).Обратите внимание, что принято сортировать главный компонент по их собственным значениям.И, как и раньше, чтобы выразить данные в новых координатах, мы просто вычисляем X*V (должно совпадать с score выше, если вы убедитесь, что совпадают знаки)

0 голосов
/ 24 февраля 2011

"Информация (собственное значение которой соответствует исходному (входному) столбцу) теряется."

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

"Есть ли способ сказать matlab не сортировать собственные значения?"

Я сомневаюсь в этом: PCA (и собственный анализ в целом) традиционно сортирует результаты по дисперсии, хотя я бы отметил, что princomp () сортирует от наибольшей к наименьшей дисперсии, тогда как eig () сортирует в обратном направлении.

Для более подробного объяснения PCA с использованием иллюстраций MATLAB, с или без princomp (), см .:

Анализ основных компонентов

...