Использование princomp() в Matlab?

Я делаю следующее в MATLAB:

>> X = [ 123 982 123 ; 434 233 842; 143 239 583; 733 292 503]

X =

123   982   123
434   233   842
143   239   583
733   292   503

[coeff,score] = princomp(X)

coeff =

-0.3714    0.9202    0.1241
 0.7330    0.2085    0.6475
-0.5700   -0.3314    0.7519


score =

 709.3366   26.4384   30.9912
-364.9469  -81.8490  125.1814
-104.8637 -262.5228 -101.7805
-239.5260  317.9334  -54.3921

>> X * coeff

ans =

 603.9913  277.1477  743.6166
-470.2922  168.8604  837.8069
-210.2090  -11.8134  610.8450
-344.8714  568.6428  658.2333

Почему не оценка = X * коэфф?

Я считаю, что X * coeff - это то же самое, что проекция необработанных данных по осям главных компонентов.

1 ответ

Xc*coeff не равно score потому что ваш X не по центру.

Как сказано в документации,

Princomp центров X путем вычитания из столбца

Вот что делает центрирование:

[m n] = size(X);
Xc = X - kron(ones(m,1),sum(X,1))/m;

Выход:

Xc =

 -235.2500  545.5000 -389.7500
   75.7500 -203.5000  329.2500
 -215.2500 -197.5000   70.2500
  374.7500 -144.5000   -9.7500

Соблюдайте это

  • [coeff,score] = princomp(Xc) возвращает точно такой же результат, как [coeff,score] = princomp(X),

  • Xc*coeff действительно равно score

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

(Кстати: princomp устарела; рекомендуется использовать pca вместо.)

Другие вопросы по тегам