Re: [問題]PCA與SVD差異

看板MATLAB作者 (~口卡口卡 修~)時間11年前 (2012/10/03 23:24), 編輯推噓4(404)
留言8則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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
非常感謝doom大的講解,非常詳細!!!
10/04 00:23, 1F

10/04 00:47, , 2F
我是使用[COEFF,latent,explained] = pcacov(M);
10/04 00:47, 2F

10/04 00:48, , 3F
與[U,SS,V]=svd(M); 進行比較
10/04 00:48, 3F

10/04 00:48, , 4F
[U,S,V]=svd(M);
10/04 00:48, 4F

10/04 02:40, , 5F
再請教大大一個問題,為何當我進行[U,S,V]=svd(M)時
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
loading正負顛倒沒差
10/05 13:27, 8F
文章代碼(AID): #1GR5YZZV (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1GR5YZZV (MATLAB)