奇異值分解(SVD)方法求解最小二乘問題的原理


@

一、奇異值分解(SVD)原理

1.1 回顧特征值和特征向量

    我們首先回顧下特征值和特征向量的定義如下:

\[Ax=λx \]

其中A是一個n×n的實對稱矩陣,x是一個n維向量,則我們說λ是矩陣A的一個特征值,而x是矩陣A的特征值λ所對應的特征向量。

求出特征值和特征向量有什么好處呢? 就是我們可以將矩陣A特征分解。如果我們求出了矩陣A的n個特征值\(λ_1≤λ_2≤...≤λ_n\),以及這n個特征值所對應的特征向量\(w_1,w_2,...,w_n\),如果這n個特征向量線性無關,那么矩陣A就可以用下式的特征分解表示:

\[A=WΣW^{−1} \]

其中W是這n個特征向量所張成的n×n維矩陣,而Σ為這n個特征值為主對角線的n×n維矩陣。一般我們會把W的這n個特征向量標准化,即滿足\(||w_i||_2=1\), 或者說\(w^T_iw_i=1\),此時W的n個特征向量為標准正交基,滿足\(W^TW=I\),即\(W^T=W^{−1}\), 也就是說W為酉矩陣。

這樣我們的特征分解表達式可以寫成

\[A=WΣW^T \]

特征值和特征向量的求解可以參考:https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html

注意到要進行特征分解,矩陣A必須為方陣。那么如果A不是方陣,即行和列不相同時,我們還可以對矩陣進行分解嗎?答案是可以,此時我們的SVD登場了。

1.2 SVD的定義

SVD也是對矩陣進行分解,但是和特征分解不同,SVD並不要求要分解的矩陣為方陣。假設我們的矩陣A是一個m×n的矩陣,那么我們定義矩陣A的SVD為:

\[A=UΣV^T \]

其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足\(U^TU=I,V^TV=I\)。下圖可以很形象的看出上面SVD的定義:
在這里插入圖片描述

1.3 求出SVD分解后的U,Σ,V矩陣

如果我們將A的轉置和A做矩陣乘法,那么會得到n×n的一個方陣\(A^TA\)。既然\(A^TA\)是方陣,那么我們就可以進行特征分解,得到的特征值和特征向量滿足下式:

\[(A^TA)v_i=λ_iv_i \]

這樣我們就可以得到矩陣\(A^TA\)的n個特征值和對應的n個特征向量v了。將\(A^TA\)的所有特征向量張成一個n×n的矩陣V,就是我們SVD公式里面的V矩陣了。一般我們將V中的每個特征向量叫做A的右奇異向量

如果我們將A和A的轉置做矩陣乘法,那么會得到m×m的一個方陣\(AA^T\)。既然\(AA^T\)是方陣,那么我們就可以進行特征分解,得到的特征值和特征向量滿足下式:

\[(AA^T)u_i=λ_iu_i \]

這樣我們就可以得到矩陣\(AA^T\)的m個特征值和對應的m個特征向量u了。將\(AA^T\)的所有特征向量張成一個m×m的矩陣U,就是我們SVD公式里面的U矩陣了。一般我們將U中的每個特征向量叫做A的左奇異向量

U和V我們都求出來了,現在就剩下奇異值矩陣Σ沒有求出了。由於Σ除了對角線上是奇異值其他位置都是0,那我們只需要求出每個奇異值σ就可以了。

我們注意到:

\[A=UΣV^T⇒AV=UΣV^TV⇒AV=UΣ⇒Av_i=σ_iu_i⇒σ_i=Av_i/u_i \]

這樣我們可以求出我們的每個奇異值,進而求出奇異值矩陣Σ。

上面還有一個問題沒有講,就是我們說\(A^TA\)的特征向量組成的就是我們SVD中的V矩陣,而\(AA^T\)的特征向量組成的就是我們SVD中的U矩陣,這有什么根據嗎?這個其實很容易證明,我們以V矩陣的證明為例。

\[A=U \Sigma V^{T} \Rightarrow A^{T}=V \Sigma^{T} U^{T} \Rightarrow A^{T} A=V \Sigma^{T} U^{T} U \Sigma V^{T}=V \Sigma^{2} V^{T} \]

上式證明使用了:\(U^TU=I,Σ^TΣ=Σ^2\)
可以看出\(A^TA\)的特征向量組成的的確就是我們SVD中的V矩陣。類似的方法可以得到\(AA^T\)的特征向量組成的就是我們SVD中的U矩陣。
進一步我們還可以看出我們的特征值矩陣等於奇異值矩陣的平方,也就是說特征值和奇異值滿足如下關系:

\[\sigma_{i}=\sqrt{\lambda_{i}} \]

這樣也就是說,我們可以不用\(\sigma_{i}=A v_{i} / u_{i}=\sqrt{\lambda_{i}}\)來計算奇異值,也可以通過求出\(A^TA\)的特征值取平方根來求奇異值。

1.4 SVD計算舉例

這里我們用一個簡單的例子來說明矩陣是如何進行奇異值分解的。我們的矩陣A定義為:

\[\mathbf{A}=\left(\begin{array}{ll} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right)\]

我們首先求出\(A^TA\)\(AA^T\)

\[\begin{array}{c} \mathbf{A}^{\mathbf{T}} \mathbf{A}=\left(\begin{array}{lll} 0 & 1 & 1 \\ 1 & 1 & 0 \end{array}\right)\left(\begin{array}{ll} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right)=\left(\begin{array}{ll} 2 & 1 \\ 1 & 2 \end{array}\right) \\ \mathbf{A} \mathbf{A}^{\mathbf{T}}=\left(\begin{array}{ll} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{lll} 0 & 1 & 1 \\ 1 & 1 & 0 \end{array}\right)=\left(\begin{array}{lll} 1 & 1 & 0 \\ 1 & 2 & 1 \\ 0 & 1 & 1 \end{array}\right) \end{array}\]

進而求出\(A^TA\)的特征值和特征向量:

\[\lambda_{1}=3 ; v_{1}=\left(\begin{array}{c} 1 / \sqrt{2} \\ 1 / \sqrt{2} \end{array}\right) ; \lambda_{2}=1 ; v_{2}=\left(\begin{array}{c} -1 / \sqrt{2} \\ 1 / \sqrt{2} \end{array}\right)\]

接着求\(AA^T\)的特征值和特征向量:

\[\lambda_{1}=3 ; u_{1}=\left(\begin{array}{c} 1 / \sqrt{6} \\ 2 / \sqrt{6} \\ 1 / \sqrt{6} \end{array}\right) ; \lambda_{2}=1 ; u_{2}=\left(\begin{array}{c} 1 / \sqrt{2} \\ 0 \\ -1 / \sqrt{2} \end{array}\right) ; \lambda_{3}=0 ; u_{3}=\left(\begin{array}{c} 1 / \sqrt{3} \\ -1 / \sqrt{3} \\ 1 / \sqrt{3} \end{array}\right)\]

利用\(Av_i=σ_iu_i,i=1,2\)求奇異值:

\[\begin{array}{l} \left(\begin{array}{cc} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{c} 1 / \sqrt{2} \\ 1 / \sqrt{2} \end{array}\right)=\sigma_{1}\left(\begin{array}{c} 1 / \sqrt{6} \\ 2 / \sqrt{6} \\ 1 / \sqrt{6} \end{array}\right) \Rightarrow \sigma_{1}=\sqrt{3} \\ \left(\begin{array}{cc} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right)\left(\begin{array}{c} -1 / \sqrt{2} \\ 1 / \sqrt{2} \end{array}\right)=\sigma_{2}\left(\begin{array}{c} 1 / \sqrt{2} \\ 0 \\ -1 / \sqrt{2} \end{array}\right) \Rightarrow \sigma_{2}=1 \end{array}\]

當然,我們也可以用$$\sigma_{i}=\sqrt{\lambda_{i}}$$直接求出奇異值為\(\sqrt{3}\)和1.
最終得到A的奇異值分解為:

\[A=U \Sigma V^{T}=\left(\begin{array}{ccc} 1 / \sqrt{6} & 1 / \sqrt{2} & 1 / \sqrt{3} \\ 2 / \sqrt{6} & 0 & -1 / \sqrt{3} \\ 1 / \sqrt{6} & -1 / \sqrt{2} & 1 / \sqrt{3} \end{array}\right)\left(\begin{array}{cc} \sqrt{3} & 0 \\ 0 & 1 \\ 0 & 0 \end{array}\right)\left(\begin{array}{cc} 1 / \sqrt{2} & 1 / \sqrt{2} \\ -1 / \sqrt{2} & 1 / \sqrt{2} \end{array}\right)\]

1.5 SVD的一些性質

    上面幾節我們對SVD的定義和計算做了詳細的描述,似乎看不出我們費這么大的力氣做SVD有什么好處。那么SVD有什么重要的性質值得我們注意呢?

對於奇異值,它跟我們特征分解中的特征值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。也就是說:

\[A_{m \times n}=U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T} \approx U_{m \times k} \Sigma_{k \times k} V_{k \times n}^{T} \]

其中k要比n小很多,也就是一個大的矩陣A可以用三個小的矩陣\(U_{m×k},Σ_{k×k},V^T_{k×n}\)
來表示。
在這里插入圖片描述
如下圖所示,現在我們的矩陣A只需要灰色的部分的三個小矩陣就可以近似描述了。

由於這個重要的性質,SVD可以用於PCA降維,來做數據壓縮和去噪。也可以用於推薦算法,將用戶和喜好對應的矩陣做特征分解,進而得到隱含的用戶需求來做推薦。同時也可以用於NLP中的算法,比如潛在語義索引(LSI)。

1.6 SVD用於PCA

PCA降維,需要找到樣本協方差矩陣\(X^TX\)的最大的d個特征向量,然后用這最大的d個特征向量張成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協方差矩陣\(X^TX\),當樣本數多樣本特征數也多的時候,這個計算量是很大的。

注意到協方差矩陣\(X^TX\)最大的d個特征向量張成的矩陣和SVD中的V矩陣是一樣的,但是SVD有個好處,有一些SVD的實現算法可以不求先求出協方差矩陣 \(X^TX\),也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA算法的背后真正的實現就是用的SVD,而不是我們我們認為的暴力特征分解。

另一方面,注意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那么左奇異矩陣有什么用呢?

假設我們的樣本是m×n的矩陣X,如果我們通過SVD找到了矩陣\(XX^T\)最大的d個特征向量張成的m×d維矩陣U,則我們如果進行如下處理:
\(X'_{d\times n}=U^T_{d\times m}X_{m\times n}\)

可以得到一個d×n的矩陣X‘,這個矩陣和我們原來的m×n維樣本矩陣X相比,行數從m減到了k,可見對行數進行了壓縮。

左奇異矩陣可以用於行數的壓縮。

右奇異矩陣可以用於列數即特征維度的壓縮,也就是我們的PCA降維。

二、線性最小二乘問題

2.1 最小二乘問題復習

\[\begin{array}{l} \min \|A x-b\|_{2}^{2} \\ A \in R^{m^{* n}} \quad x \in R^{n} \quad b \in R^{m} \end{array}\]

m個方程求解n個未知數,有三種情況:

  • m=n且A為非奇異,則有唯一解,\(x=A^{-1}b\)
  • m>n,約束的個數大於未知數的個數,稱為超定問題(overdetermined)
  • m<n,負定/欠定問題(underdetermined)

通常我們遇到的都是超定問題,此時Ax=b的解是不存在的,從而轉向解最小二乘問題:

\[J(x)=min \|A x-b\|_{2}^{2} \]

J(x)為凸函數,我們令一階導數為0,得到:\(A^{T} A x-A^{T} b=0\),稱之為正規方程一般解:

\[x=\left(A^{T} A\right)^{-1} A^{T} b \]

2.2 廣義逆矩陣

在這里插入圖片描述

2.2 奇異值分解與線性最小二乘問題

因為矩陣的逆很難求解,因此用SVD分解A矩陣的廣義逆
對於m×n的矩陣A,其奇異值分解如下:

\[A=UΣV^T \]

根據奇異值分解,可以通過下面的計算得到廣義逆:

\(A^+=(UΣV^T)^+=(ΣV^T)^+U^{−1}=VΣ^+U^T\)

其中,Σ因為是對角陣,所以廣義逆就是他所有元素的倒數。可以看到這樣子求解逆就十分容易了

三、SVD分解求解超定方程Ax=0(比二更簡便的結論)

$Ax = 0 $ 對A做SVD分解,得\(U\Sigma V^Tx =0\)
因為是超定方程,一般無法等於0,問題轉換為求最小值 =\(||U\Sigma V^Tx||_{min}\)
因為\(U\)是一個正交矩陣:正交變換不改變矩陣的秩, 特征值, 行列式, 跡 所以有:
在這里插入圖片描述
Ax=0的SVD解是V的最后一列

參考鏈接

https://www.cnblogs.com/pinard/p/6251584.html
https://zhuanlan.zhihu.com/p/131097680
https://blog.csdn.net/weixin_42587961/article/details/97374248

打賞

創作不易,如果對您有幫助,就打賞一下吧O(∩_∩)O


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM