作者ht15trep (Bishop)
看板MATLAB
标题Re: [问题]PCA与SVD差异
时间Sun Oct 7 21:25:59 2012
※ 引述《IamMRBBB (兽兽)》之铭言:
: 各位好
: 最近我使用SVD来分析我的资料的时候,
: 确认SVD与PCA的特徵向量是一样的,
: 但是他们不同处在哪?
: 以及特性差别,或是在什麽时候才会出现不同呢?
: 不知道能否有人回答,感谢。
如果你有一个资料矩阵 X 大小为 M(num of rows)*L(num of columns)
举例 若每一栏代表不同的变数,每一列则为各自变数不同时间的观测
[U,S,V]=svd(X,0)
可以得到X的主成分(特徵向量)为V,第一栏为第1主成分,S(1)^2为第一主成分的特徵值
没经过移除平均 detrend(X,'constant') 我们一样能得到一组主成分
但是没办法以共变异矩阵(移除平均)或是相关系数矩阵(移除平均并除以标准差)去解释
仅是如此
=========================================
X=abs(rand(10,5))*20;
[u1 s1 v1]=svd(X,0);
[u2 s2 v2]=svd(detrend(X,'constant'),0);
[v3 s3]=eig(cov(X));
[s3 ord]=sort(diag(s3),'descend');
s3=diag(s3);
v3=v3(:,ord);
其中v2有移除平均,所以主成分会跟v3相同,但是v1没移除平均就跟其他两个不同
(这里没有比较特徵值)
X=abs(rand(10,5))*20;
X2=detrend(X,'constant');
X2=X2*diag(std(X2).^-1);
[u1 s1 v1]=svd(X2,0);
[v2 s2]=eig(corrcoef(X));
[s2 ord]=sort(diag(s2),'descend');
s2=diag(s2);
v2=v2(:,ord);
EV1=diag(s1).^2/trace(s1)^2;
EV2= diag(s2)/trace(s2);
当移除平均又除以标准差後,其svd(.)的结果就和eig(corrcoef(.))相同
另外值得一提的就是虽然svd(.)和eig(corrcoef(.))之特徵值大小不一样
但是以百分比来看却是一样
=========================================
附上一份我觉得还不错的网路教材
http://www.smast.umassd.edu/mixing/LabInOcean/lecture_notes/
MAR-599_LabInOceanogr_wk12.ppt
缩址:
http://ppt.cc/t1YH
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.218.33.43
1F:→ ht15trep:以princomp去解特徵向量就是用svd了,用 edit princomp 看 10/07 21:27
2F:→ ht15trep:另外就是解释变异的总合应与变数总数相同 10/09 14:05
3F:→ ht15trep:所以实际的EV1和EV2要乘以总变数量5才是正确的值 10/09 14:06
4F:→ ht15trep:(变数数量:5,观测次数:10) 10/09 14:06
5F:推 IamMRBBB:非常的棒,感谢ht15trep大! 10/09 15:45