作者doom8199 (~口卡口卡 修~)
看板MATLAB
标题Re: [问题]PCA与SVD差异
时间Wed Oct 3 23:24:15 2012
※ 引述《IamMRBBB (兽兽)》之铭言:
: 各位好
: 最近我使用SVD来分析我的资料的时候,
: 确认SVD与PCA的特徵向量是一样的,
: 但是他们不同处在哪?
: 以及特性差别,或是在什麽时候才会出现不同呢?
: 不知道能否有人回答,感谢。
---
我不确定原po是怎麽用 SVD 实现 PCA
这里先给一个观念
-1
一个方阵 M 若 EVD 存在 (即 M 可分解为 WDW )
T
则 M 的 SVD 分解 M = UEV 中, U 不一定会等於 W
对一个方阵而言,EVD 和 SVD 本身就是不同的取向
即使很多时後我们用 svd 与 eig 来拆解一个方阵後
发现数值完全一样,但几何解读是完全不同的
不能将这两种混用
====
回到正题,假设有一笔资料存成 KxH 大小的矩阵 M = [x1,x2,...,x_H]
该矩阵 M 也已做过平移正规化 or 白平衡等处理
要实现 PCA, 做法就是:
[ W, D] = eig(M*M'); ____(1)
or
[ U, S, ~] = svd(M); ____(2)
T
理由很简单,因为若 M = USV
T T T T T
-1
则 MM = USV VS U = USSU
= WDW
相当於对 MM' 矩阵做 EVD 拆解
但右边做法就不对了:
[ U, S, ~] = svd(M*M'); ____(x)
理由如一开始所述
(x) 求出来的 U , 与 (1)中的 W , 几何结构完全不同
=========
此外,个人认为 (2) 会比 (1) 好
最主要的因素是精确度问题
因为当你求一笔资料的 covariance matrix
一定会处理到 M*M' 这种矩阵
若你本身资料 M 的 dynamic range 就不小
去算如 M*M' 的 EVD, 精确度通常不会太高
;但相对的,直接算 M 的 svd
就可以避掉处理 M*M' 这种 higher dynamic range 的矩阵
我自己在 OpenCV 上实做某些 proj. 途中
就有发现使用 svd(M) 在结果上的表现,会比 eig(M*M') 还佳
第二个是排序问题
印象中 matlab 的 eig 函式对於 eigenvalue 的大小排序
不同版本好像会产生不同结果 OTZ
所以 matlab 里头内建的 pca 相关函式,一定会有 sorter 来确保大小顺序
;但 svd 排序上似乎较稳定 (?)
不过这也不能算是问题
不论使用何种工具,後面一律加 sorter,就不必为了这种东西烦恼
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.51.91
※ 编辑: doom8199 来自: 60.251.51.91 (10/03 23:27)
1F:推 IamMRBBB:非常感谢doom大的讲解,非常详细!!! 10/04 00:23
2F:推 IamMRBBB:我是使用[COEFF,latent,explained] = pcacov(M); 10/04 00:47
3F:→ IamMRBBB:与[U,SS,V]=svd(M); 进行比较 10/04 00:48
4F:→ IamMRBBB:[U,S,V]=svd(M); 10/04 00:48
5F:推 IamMRBBB:再请教大大一个问题,为何当我进行[U,S,V]=svd(M)时 10/04 02:40
6F:→ IamMRBBB:总是会有某栏的数据正负颠倒,目前发现是常常有一栏, 10/04 02:41
7F:→ IamMRBBB:但是它是不固定某一栏 10/04 02:42
8F:推 ht15trep:loading正负颠倒没差 10/05 13:27