特徵工程中有一個常用的技巧為奇異值分解(Singular Value Decomposition, SVD),這個方法是一些進階資料分析技術的基礎,像是主成分分析(Principal Component Analysis, PCA)的後台運算也可以使用SVD,PCA的詳細操作過程,可以參考旗標出版的「跨領域學Python:資料科學基礎養成」。
認真的讀者想必看過一些資料介紹怎麼計算SVD,但是你曾經成功計算出一個任意矩陣的SVD嗎?今天我們就來展示一次SVD計算,以及可能會遇到的陷阱。
一、SVD計算
我們用以下矩陣作為SVD計算的範例:
(1)、計算A乘以A的轉置:
(2)、計算Eigenvalue:
(3)、將步驟(2)的Eigenvalue開根號,從大到小放在一個跟A一樣大的矩陣的對角線上,其餘位置擺0:
(4)、計算Eigenvector:
(4–1)、Eigenvalue = 3 :
(4–2)、Eigenvalue = 2:
(4–3)、Eigenvalue = 0:
(5)、將步驟(4)的3個Eigenvector根據對應的Eigenvalue,由大到小以column的方式並排:
(6)、計算A的轉置乘以A :
(7)、計算Eigenvalue:
(8)、計算Eigenvector:
(8–1)、Eigenvalue = 3 :
(8–2)、Eigenvalue = 2 :
(9)、將步驟(8)的2個Eigenvector根據對應的Eigenvalue,由大到小以column的方式並排:
二、驗證SVD計算
哪裡錯了?
三、Eigenvector方向的任意性
仔細觀察一下,會導致矩陣A的第一行錯誤,是因為矩陣U的第二行怪怪的。我們回顧一下步驟(4–2),這裡我們要算的是Eigenvector:
接著我們維持Eigenvector的大小,但是修改Eigenvector的方向:
然後重新計算一次矩陣A:
這次對了!
四、SVD計算過程中,Eigenvector方向選擇問題
我們會發現:在計算Eigenvector的過程中,Eigenvector的方向可以任意選擇。但是計算重新組裝回矩陣A時,Eigenvector的方向是不能亂選!
此外,假設我們使用SVD的目標,是要萃取出矩陣U(或V),並且使用矩陣U(或V)做後續的計算。那麼矩陣U(或V)裡頭所有向量的正負號,會不會影響後續的資料分析呢?如果我們的分析不是只看向量的絕對值,那是有可能會造成影響。
更麻煩的問題是,當我們計算Eigenvector的時候,怎麼知道如何選向量的方向?此外,實務上我們都是使用一些程式語言的函式庫來算SVD,我們又怎麼知道這些函式算出來的矩陣U(或V),其向量的方向是我們想要的?
關於方向選擇這個問題,我們在下篇時會提供一個大略的判斷方式,屆時會基於今天的結果做其他(大量)的運算。這篇貼文到目前為止,已經有很多矩陣運算的內容了,我們就在這裡下課休息,請讀者先練習、熟悉SVD的計算過程喔。
重點整理
1、SVD計算過程中,如果Eigenvector方向選擇錯誤,會造成無法正確組合回原矩陣。
2、Eigenvector的方向選擇,可能會造成後續分析的結果不同。
參考資料
1、Brunton S. and Kutz J. N. (2019). Data-Driven Science and Engineering: Machine Learning, Dynamic Systems, and Control. Cambridge: Cambridge University Press.
2、Freidberg S. H., Insel A. J., and Spence L. E. (2003). Linear Algebra. 4th ed., New Jersey: Pearson Education, Inc.
關於作者
Chia-Hao Li received the M.S. degree in computer science from Durham University, United Kingdom. He engages in computer algorithm, machine learning, and hardware/software codesign. He was former senior engineer in Mediatek, Taiwan. His currently research topic is the application of machine learning techniques for fault detection in the high-performance computing systems.