老铁,欢迎赶上二路公交车。让我们畅游一下SVD算法的理论推导与应用。奇异值分解(Singular Value Decomposition, SVD)是更为通用化的矩阵分解方式,与特征分解不(矩阵必须为方阵)同,SVD并不要求矩阵为方阵。这样SVD可以应用在图像压缩、去噪、降维、推荐系统等领域。下面就进行简单介绍SVD算法的计算步骤与实例操作。
假设我们需要对矩阵 A A A进行SVD分解操作,已知矩阵 A A A是一个 m × n m×n m×n的矩阵,其中m与n可以相等(特征分解)也可以不等(绝大多数情况不相等)。那么定义矩阵 A A A的SVD分解公式如下:
(1) A = U ∗ ∑ ∗ V T A=U*\sum{}*V^{T}\tag{1} A=U∗∑∗VT(1)
参数解释:
U U U是一个 m × m m×m m×m的矩阵, ∑ ∑ ∑是一个 m × n m×n m×n的对角矩阵(即:除了对角线上的元素意外全为0,对角线上的每个元素都为奇异值), V V V是一个 n × n n×n n×n的矩阵。 U U U和 V V V都是酉矩阵,即满足 U T U = E U^T U=E UTU=E, V T V = E V^T V=E VTV=E,其中 E E E为单位矩阵。
那么,SVD的求解就是求出公式等号右边矩阵 U U U、 ∑ ∑ ∑、 V T V^T VT这三个矩阵?
下面我们就来求解上述的 U U U、 ∑ ∑ ∑、 V T V^T VT三个矩阵步骤如下:
S t e p 1 Step1 Step1: 我们首先使用矩阵 A A A乘以 A T A^T AT( A A A的转置矩阵),那么会得到一个 m × m m×m m×m的方阵 A A T AA^T AAT。我们对方阵 A A T AA^T AAT进行特征分解,那么得到特征值与特征向量满足下式:
( A A T ) u i = α i u i (AA^{T})u_i=α_i u_i (AAT)ui=αiui
其中, α i α_i αi为方阵 A A T AA^T AAT的特征值, u i u_i ui为对应的特征向量。
我们知道方阵 A A T AA^T AAT为 m × m m×m m×m,那么特征分解后有 m m m个特征值,同时对应 m m m个特征向量 u i u_i ui。将 m m m个特征向量 u i u_i ui组成一个 m × m m×m m×m的矩阵 U U U,就是我们需要求解的公式1的矩阵 U U U。
S t e p 2 Step2 Step2: 使用矩阵 A T A^{T} AT( A A A的转置)乘以 A A A,那么会得到一个 n × n n×n n×n的方阵 A T A A^{T}A ATA。我们对方阵 A T A A^{T}A ATA进行特征分解,那么得到特征值与特征向量满足下式:
( A T A ) v i = β i v i (A^{T}A)v_i=β_i v_i (ATA)vi=βivi
其中, β i β_i βi为方阵 A T A A^{T}A ATA的特征值, v i v_i vi为对应的特征向量。
方阵 A T A A^T A ATA为 n × n n×n n×n,那么特征分解后有 n n n个特征值,同时对应 n n n个特征向量 v i v_i vi,将 n n n个特征向量 v i v_i vi组成一个 n × n n×n n×n的矩阵 V V V,将矩阵 V V V转置操作后就是我们需要求解公式1的矩阵 V T V^T VT。
S t e p 3 Step3 Step3: 接下来是要求解出中间的对角矩阵 ∑ ∑ ∑,我们知道 ∑ ∑ ∑除了对角线上以外都是0,所以我们只需要求解对角线上的奇异值就可以。
∑ = [ σ 0 0 0 . . . 0 0 0 0 σ 1 0 . . . 0 0 0 0 0 σ 2 . . . 0 0 0 0 0 0 . 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 . 0 0 0 0 . . . 0 0 σ m ] ∑= \left[ \begin{matrix} σ_{0} & 0 & 0 & ... & 0 & 0 & 0 \\ 0 & σ_{1} & 0 &... & 0 & 0 & 0 \\ 0 & 0 & σ_{2} & ... & 0 & 0 & 0 \\ 0 & 0 & 0 & . & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & . & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & . & 0 \\ 0 & 0 & 0 & ... & 0 & 0 & σ_{m} \end{matrix} \right] ∑=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡σ00000000σ10000000σ20000..........00...0000.0000000.0000000σm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
其中,奇异值 σ 0 , σ 1 , . . . , σ m σ_{0},σ_{1},...,σ_{m} σ0,σ1,...,σm是 m m m个奇异值存在一些为0的,假设 m > n m>n m>n, k k k个奇异值不为零( k < n k<n k<n),那么存在 m − k m-k m−k个为0。
根据公式1进行推导:
A = U ∗ ∑ ∗ V T A=U*∑*V^{T} A=U∗∑∗VT
则有:
→ A V = U ∑ V T V → A V = U ∑ → A v i = σ i u i \rightarrow{AV=U∑V^{T}V}\rightarrow{AV=U∑}\rightarrow{Av_i=σ_{i}u_{i}} →AV=U∑VTV→AV=U∑→Avi=σiui
因此可以得到:
σ i = A v i u i σ_{i}=\frac{Av_{i}}{u_{i}} σi=uiAvi
我们在 S t e p 1 Step1 Step1与 S t e p 2 Step2 Step2两个步骤分别得出了 u i u_i ui和 v i v_i vi,所以可以轻易计算出每一个对应的奇异值 σ i σ_i σi,组合在一起就是中间的对角矩阵 ∑ ∑ ∑。
附:
证明上述 S t e p 1 Step1 Step1与 S t e p 2 Step2 Step2用到的默认定理 A A T AA^T AAT特征分解的特征向量 u i u_i ui组成一起就是公式1的矩阵 U U U, A T A A^T A ATA特征分解的特征向量 v i v_i vi组成一起就是公式1的矩阵 V V V。
以 U U U矩阵为例证明:
A = U ∑ V T → A T = V ∑ U T A=U∑V^{T}\rightarrow{A^{T}=V∑U^{T}} A=U∑VT→AT=V∑UT
所以:
A A T = U ∗ ∑ ∗ V T ∗ V ∗ ∑ T ∗ U T = U ( ∑ ) 2 U T AA^{T}=U*∑*V^{T}*V*∑^{T}*U^{T}=U(∑)^{2}U^{T} AAT=U∗∑∗VT∗V∗∑T∗UT=U(∑)2UT
其中对角矩阵 ∑ T = ∑ ∑^T=∑ ∑T=∑, V T V = V V T = E V^T V=VV^T=E VTV=VVT=E为单位矩阵。
证明毕。
我们来进一步分析一下上式: A A T = U ∑ 2 U T AA^T=U∑^2 U^T AAT=U∑2UT
A A T = U ∑ ( U ∑ ) T AA^T=U∑(U∑)^T AAT=U∑(U∑)T
Solo可以得到特征值矩阵等于奇异值矩阵的平方,满足如下关系式:
σ i = α i σ_{i}=\sqrt{α_i} σi=αi
这样,我们可以不用通过求 σ i = A v i u i σ_i=\frac{Av_i}{u_i} σi=uiAvi,直接通过 A A T AA^T AAT的特征值开平方根求取对应的奇异值 σ i σ_i σi。
我们求出所有的奇异值 σ i σ_i σi,组成一个 m × n m×n m×n的对角矩阵 ∑ ∑ ∑。
至此,我们公式1中的三个矩阵求解完毕,SVD算法分解过程结束。
上述说完SVD算法求解过程之后,下面我们来进行一个实例计算以加强理解。我们对矩阵 A A A的定义如下:
A = [ 1 1 0 1 1 0 ] A= \left[ \begin{matrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \end{matrix} \right] A=⎣⎡101110⎦⎤
解:
首先计算 A A T AA^{T} AAT:
A A T = [ 1 1 0 1 1 0 ] ∗ [ 1 0 1 1 1 0 ] = [ 2 1 1 1 1 0 1 0 1 ] AA^{T}= \left[ \begin{matrix} 1 & 1 \\ 0 & 1 \\ 1 & 0 \end{matrix} \right]* \left[ \begin{matrix} 1 & 0 & 1 \\ 1 & 1 & 0 \\ \end{matrix} \right]= \left[ \begin{matrix} 2 & 1 & 1 \\ 1 & 1 & 0\\ 1 & 0 & 1 \end{matrix} \right] AAT=⎣⎡101110⎦⎤∗[110110]=⎣⎡211110101⎦⎤
计算 A A T AA^T AAT 特征值 α i α_i αi与特征向量 u i u_i ui:
α 1 = 3 , u 1 = [ 2 6 1 6 1 6 ] α_1=3,u_1=\left[ \begin{matrix} \frac{2}{\sqrt{6}} \\ \frac{1}{\sqrt{6}}\\ \frac{1}{\sqrt{6}} \end{matrix} \right] α1=3,u1=⎣⎢⎡626161⎦⎥⎤
α 2 = 1 , u 2 = [ 0 1 2 − 1 2 ] α_2=1,u_2=\left[ \begin{matrix} 0 \\ \frac{1}{\sqrt{2}}\\ \frac{-1}{\sqrt{2}} \end{matrix} \right] α2=1,u2=⎣⎡0212−1⎦⎤
α 3 = 0 , u 3 = [ − 1 3 1 3 1 3 ] α_3=0,u_3=\left[ \begin{matrix} \frac{-1}{\sqrt{3}} \\ \frac{1}{\sqrt{3}}\\ \frac{1}{\sqrt{3}} \end{matrix} \right] α3=0,u3=⎣⎢⎡3−13131⎦⎥⎤
则我们将 u 1 u_1 u1、 u 2 u_2 u2、 u 3 u_3 u3组合成矩阵 U U U:
U = ( u 1 , u 2 , u 3 ) = [ 2 6 0 − 1 3 1 6 1 2 1 3 1 6 − 1 2 1 3 ] U= (u_1, u_2, u_3)= \left[ \begin{matrix} \frac{2}{\sqrt{6}} & 0 & \frac{-1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}}\\ \frac{1}{\sqrt{6}} & \frac{-1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \end{matrix} \right] U=(u1,u2,u3)=⎣⎢⎡6261610212−13−13131⎦⎥⎤
其次计算 A T A A^T A ATA:
A T A = [ 2 1 1 2 ] A^{T}A= \left[ \begin{matrix} 2 & 1 \\ 1 & 2 \end{matrix} \right] ATA=[2112]
计算 A T A A^T A ATA矩阵的特征值 β i β_i βi与特征向量 v i v_i vi:
β 3 = 3 , v 1 = [ 1 2 1 2 ] β_3=3, v_1=\left[ \begin{matrix} \frac{1}{\sqrt{2}}\\ \frac{1}{\sqrt{2}} \end{matrix} \right] β3=3,v1=[2121]
β 1 = 1 , v 2 = [ − 1 2 1 2 ] β_1=1, v_2=\left[ \begin{matrix} \frac{-1}{\sqrt{2}}\\ \frac{1}{\sqrt{2}} \end{matrix} \right] β1=1,v2=[2−121]
则我们将特征向量 v 1 v_1 v1、 v 2 v_2 v2组成矩阵 V V V:
V = ( v 1 , v 2 ) = [ 1 2 − 1 2 1 2 1 2 ] V=(v_1, v_2)= \left[ \begin{matrix} \frac{1}{\sqrt{2}} & \frac{-1}{\sqrt{2}}\\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{matrix} \right] V=(v1,v2)=[21212−121]
将矩阵 V V V转置一下就得到我们公式1的 V T V^T VT。
最后,我们来计算对角矩阵 ∑ ∑ ∑的特征值 σ i σ_i σi:
求解 σ i σ_i σi可以通过公式:
σ i = A v i u i σ_i=\frac{Av_i}{u_i} σi=uiAvi
或者通过 σ i = α i σ_i=\sqrt{α_i} σi=αi来进行得到。
我们采取 σ i = α i σ_i=\sqrt{α_i} σi=αi进行得到奇异值:
σ 1 = α 1 = 3 σ_1=\sqrt{α_1}=\sqrt{3} σ1=α1=3
同理:
σ 2 = α 2 = 1 σ_2=\sqrt{α_2}=1 σ2=α2=1
这样我们的对角矩阵 ∑ ∑ ∑如下:
∑ = [ 1 3 0 0 1 0 0 ] ∑=\left[ \begin{matrix} \frac{1}{\sqrt{3}} & 0\\ 0 & 1 \\ 0 & 0 \end{matrix} \right] ∑=⎣⎡3100010⎦⎤
最后我们SVD分解矩阵 A A A为如下:
A = U ∑ V T = [ 2 6 0 − 1 3 1 6 1 2 1 3 1 6 − 1 2 1 3 ] ∗ [ 1 3 0 0 1 0 0 ] ∗ [ 1 2 1 2 − 1 2 1 2 ] \begin{aligned} A=& U∑V^{T}\\ =& {\left[ \begin{matrix} \frac{2}{\sqrt{6}} & 0 & \frac{-1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}}\\ \frac{1}{\sqrt{6}} & \frac{-1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \end{matrix} \right]}* {\left[ \begin{matrix} \frac{1}{\sqrt{3}} & 0\\ 0 & 1 \\ 0 & 0 \end{matrix} \right]}* {\left[ \begin{matrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}}\\ \frac{-1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{matrix} \right]} \end{aligned} A==U∑VT⎣⎢⎡6261610212−13−13131⎦⎥⎤∗⎣⎡3100010⎦⎤∗[212−12121]
到此,我们的奇异值SVD分解理论推导告一段落。奇异值分解SVD应用十分广泛,PCA其实可以算作SVD的一个特殊情况进行求取。后期将会对SVD分解方法应用到图像压缩与去噪技术上面,来进行加深理解SVD算法。
最后,如有错误,还请批评指正。到站了,老铁。
https://zhuanlan.zhihu.com/p/29846048
https://www.zhihu.com/question/22237507