Использование 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
вместо.)