首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab中使用princomp()?

在Matlab中使用princomp()?
EN

Stack Overflow用户
提问于 2015-06-11 11:57:07
回答 1查看 363关注 0票数 1

我在MATLAB中执行以下操作:

代码语言:javascript
复制
>> 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

为什么score =X*coeff值不是?

我相信X* coeff与沿着主成分轴投影原始数据是相同的。

EN

回答 1

Stack Overflow用户

发布于 2015-06-13 00:26:19

Xc*coeff不等于score,因为您的X不居中。

作为documentation says

通过减去列平均值,

princomp将X居中

以下是居中的作用:

代码语言:javascript
复制
[m n] = size(X);
Xc = X - kron(ones(m,1),sum(X,1))/m;

输出:

代码语言:javascript
复制
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。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30771308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档