奇異值分解以及matlab實現

卢宇博發表於2024-07-09

奇異值分解(Singular Value Decomposition)是線性代數中一種重要的矩陣分解,具有壓縮矩陣資訊的作用

目錄
  • 一、奇異值分解的理論介紹
    • 1.奇異值分解的例子
    • 2.U的計算
    • 3.V的計算
    • 4.Σ的計算
    • 5.利用SVD對資料進行"降維"
      • (1)對U與V進行分塊,得到分塊矩陣
      • (2)去除奇異值後得到壓縮後的矩陣
      • (3)保留原矩陣的特徵比例
  • 二、Matlab進行奇異值分解
    • 1.[U,S,V] = svd(A)
      • (1)矩陣分解
      • (2)矩陣重構
    • 2.編寫可直接進行奇異值分解的函式————mysvd

一、奇異值分解的理論介紹

1.奇異值分解的例子

所謂奇異值分解,就是把矩陣A分解成三個矩陣的乘積,其中中間的矩陣只有主對角線有元素,上面的元素就是奇異值

2.U的計算

對A乘以A的轉置相似對角化,得到的UΛU'。

3.V的計算

對A的轉置乘以A相似對角化,得到的VΛV'。

4.Σ的計算

A*A'與A'A的特徵值相同,將其特徵值開方就可以得到我們的奇異值

5.利用SVD對資料進行"降維"

這⾥所說的降維,實際上是使得矩陣的秩減小,矩陣大小並未改變。

(1)對U與V進行分塊,得到分塊矩陣

此處我們的第三項奇異值佔比過小,所以我們想去除第三項

(2)去除奇異值後得到壓縮後的矩陣

由於第三項奇異值被去除,因此我們對Σ的處理就是保留前兩行,因此U也只保留前兩列,V只保留前兩行。處理之後得到了我們壓縮後的矩陣

(3)保留原矩陣的特徵比例

透過奇異值分解,我們得到了保留原矩陣93%資訊的新矩陣

二、Matlab進行奇異值分解

1.[U,S,V] = svd(A)

(1)矩陣分解

在matlab中有自帶的函式可以幫助我們進行奇異值分解。返回的第一個引數為U,第二個引數為Σ,第三個引數為V。輸入的引數為需要進行奇異值分解的矩陣A
[U,S,V] = svd(A)
效果如圖所示

(2)矩陣重構

經過觀察,我們只想保留前兩項奇異值。Σ的行數從3行變成了2行,因此我們要重構矩陣,就只保留U的前兩個列。Σ的列數從4列變成了兩列,因此V也只保留前兩行
U(:,1:2)*S(1:2,1:2)*V(:,1:2)' 注意:此處的V是經過轉置的

2.編寫可直接進行奇異值分解的函式————mysvd

[compress_A] = mysvd(A, ratio)這是我們自己編寫的函式,這裡所輸出的引數就是經過壓縮過後的A。需要輸入的一個引數為需要處理的矩陣A,第二個引數為最少需要儲存的比例
此函式的編寫並不複雜,也呼叫了matlab的函式svd,透過建立一個迴圈,當儲存的比例大於所給的ration時就退出迴圈,然後輸出經過壓縮的矩陣

相關文章