作者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