奇异值分解 SVD 的数学解释
奇異值分解(Singular Value Decomposition,SVD)是一種矩陣分解(Matrix Decomposition)的方法。除此之外,矩陣分解還有很多方法,例如特征分解(Eigendecomposition)、LU分解(LU decomposition)、QR分解(QR decomposition)和極分解(Polar decomposition)等。這篇文章主要說下奇異值分解,這個方法在機器學習的一些算法里占有重要地位。
相關概念
參考自維基百科。
正交矩陣:若一個方陣其行與列皆為正交的單位向量,則該矩陣為正交矩陣,且該矩陣的轉置和其逆相等。兩個向量正交的意思是兩個向量的內積為 0
正定矩陣:如果對于所有的非零實系數向量 zz,都有 zTAz>0zTAz>0,則稱矩陣 AA 是正定的。正定矩陣的行列式必然大于 0, 所有特征值也必然 > 0。相對應的,半正定矩陣的行列式必然 ≥ 0。
定義
下面引用 SVD 在維基百科中的定義。
In linear algebra, the singular value decomposition (SVD) is a factorization of a real or complex matrix. It is the generalization of the eigendecomposition of a positive semidefinite normal matrix (for example, a symmetric matrix with positive eigenvalues) to any m×nm×n matrix via an extension of polar decomposition.
也就是說 SVD 是線代中對于實數矩陣和復數矩陣的分解,將特征分解從 半正定矩陣 推廣到任意 m×nm×n 矩陣。
注意:本篇文章內如未作說明矩陣均指實數矩陣。
假設有 m×nm×n 的矩陣 AA ,那么 SVD 就是要找到如下式的這么一個分解,將 AA 分解為 3 個矩陣的乘積:
Am×n=Um×mΣm×nVTn×n
Am×n=Um×mΣm×nVn×nT
其中,UU 和 VV 都是正交矩陣 (Orthogonal Matrix),在復數域內的話就是酉矩陣(Unitary Matrix),即
UTU=Em×m
UTU=Em×m
VTV=En×n
VTV=En×n
換句話說,就是說 UU 的轉置等于 UU 的逆,VV 的轉置等于 VV 的逆:
UT=U?1
UT=U?1
VT=V?1
VT=V?1
而 ΣΣ 就是一個非負實對角矩陣。
那么 UU 和 VV 以及 ΣΣ 是如何構成的呢?
求解
UU 和 VV 的列分別叫做 AA 的 左奇異向量(left-singular vectors)和 右奇異向量(right-singular vectors),ΣΣ 的對角線上的值叫做 AA 的奇異值(singular values)。
其實整個求解 SVD 的過程就是求解這 3 個矩陣的過程,而求解這 3 個矩陣的過程就是求解特征值和特征向量的過程,問題就在于 求誰的特征值和特征向量。
UU 的列由 AATAAT 的單位化過的特征向量構成
VV 的列由 ATAATA 的單位化過的特征向量構成
ΣΣ 的對角元素來源于 AATAAT 或 ATAATA 的特征值的平方根,并且是按從大到小的順序排列的
知道了這些,那么求解 SVD 的步驟就顯而易見了:
求 AATAAT 的特征值和特征向量,用單位化的特征向量構成 UU
求 ATAATA 的特征值和特征向量,用單位化的特征向量構成 VV
將 AATAAT 或者 ATAATA 的特征值求平方根,然后構成 ΣΣ
舉例
假設
A=?????21004300?????
A=(24130000)
那么可以計算得到
AAT=?????20140014100000000000?????
AAT=(20140014100000000000)
接下來就是求這個矩陣的特征值和特征向量了
AATx=λx
AATx=λx
(AAT?λE)x=0
(AAT?λE)x=0
要想該方程組有非零解(即非零特征值),那么系數矩陣 AAT?λEAAT?λE 的行列式必須為 0
∣∣∣∣∣∣20?λ14001410?λ0000?λ0000?λ∣∣∣∣∣∣=0
|20?λ14001410?λ0000?λ0000?λ|=0
求解這個行列式我就不再贅述了,這個直接使用行列式展開定理就可以了,可以得到 λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0,有 4 個特征值,因為特征多項式 |AAT?λE||AAT?λE| 是一個 4 次多項式。對應的單位化過的特征向量為
?????0.817415560.5760484400?0.576048440.817415560000100001?????
(0.81741556?0.57604844000.576048440.817415560000100001)
這就是矩陣 UU 了。
同樣的過程求解 ATAATA 的特征值和特征向量,求得 λ1≈0.13393125,λ2≈29.86606875λ1≈0.13393125,λ2≈29.86606875,將特征值降序排列后對應的單位化過的特征向量為
(0.404553580.9145143?0.91451430.40455358)
(0.40455358?0.91451430.91451430.40455358)
這就是矩陣 VV 了。
而矩陣 ΣΣ 根據上面說的為特征值的平方根構成的對角矩陣
?????5.464985700000.3659661900?????
(5.4649857000.365966190000)
到此,SVD 分解就結束了,原來的矩陣 AA 就被分解成了 3 個矩陣的乘積。
A4×2=U4×4Σ4×2VT2×2
A4×2=U4×4Σ4×2V2×2T
?????21004300?????=?????0.817415560.5760484400?0.576048440.817415560000100001??????????5.464985700000.3659661900?????(0.404553580.9145143?0.91451430.40455358)T
(24130000)=(0.81741556?0.57604844000.576048440.817415560000100001)(5.4649857000.365966190000)(0.40455358?0.91451430.91451430.40455358)T
Numpy 實現
Python 中可以使用 numpy 包的 linalg.svd() 來求解 SVD。
import numpy as np
A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
print(np.linalg.svd(A))
1
2
3
4
輸出
(array([[-0.81741556, -0.57604844, 0. , 0. ],
[-0.57604844, 0.81741556, 0. , 0. ],
[ 0. , 0. , 1. , 0. ],
[ 0. , 0. , 0. , 1. ]]),
array([ 5.4649857 , 0.36596619]),
array([[-0.40455358, -0.9145143 ],
[-0.9145143 , 0.40455358]]))
1
2
3
4
5
6
7
END
---------------------
作者:secondsilverman
來源:CSDN
原文:https://blog.csdn.net/u010099080/article/details/68060274
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的奇异值分解 SVD 的数学解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [实现] 利用 Seq2Seq 预测句子
- 下一篇: super(Student,self).