Re: [問題]PCA與SVD差異
※ 引述《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)
推
10/04 00:23, , 1F
10/04 00:23, 1F
推
10/04 00:47, , 2F
10/04 00:47, 2F
→
10/04 00:48, , 3F
10/04 00:48, 3F
→
10/04 00:48, , 4F
10/04 00:48, 4F
推
10/04 02:40, , 5F
10/04 02:40, 5F
→
10/04 02:41, , 6F
10/04 02:41, 6F
→
10/04 02:42, , 7F
10/04 02:42, 7F
推
10/05 13:27, , 8F
10/05 13:27, 8F
討論串 (同標題文章)