奇異值分解 Singular Value Decomposition, SVD

SVD 的核心概念

SVD 常被用於降維、壓縮及推薦系統。
SVD 將任何一個矩陣 A 分解為三個特定的矩陣相乘:

實作矩陣重建與降維

題目:實作 svd_compress(A, k)

功能要求:

  1. 將輸入矩陣 A 分解。
  2. 僅保留前 k 個最大的奇異值以達到降維/壓縮效果。
  3. 回傳重建後的近似矩陣。

答案程式碼:

import numpy as np

def svd_compress(A, k):
    # 1. 執行分解:得到 U, s (1D 陣列), Vh (V的轉置)
    U, s, Vh = np.linalg.svd(A)
    
    # 2. 降維處理:只取前 k 個組成部分
    U_k = U[:, :k]          # 取 U 的前 k 欄
    s_k = s[:k]            # 取前 k 個奇異值
    Vh_k = Vh[:k, :]       # 取 Vh 的前 k 列
    
    # 3. 建立對角矩陣 Sigma_k
    Sigma_k = np.diag(s_k)
    
    # 4. 重建矩陣:A_approx = U_k * Sigma_k * Vh_k
    # 使用 np.dot 或 @ 進行矩陣相乘
    A_approx = np.dot(U_k, np.dot(Sigma_k, Vh_k))
    
    return A_approx

核心考點解析:

  1. 分解語法:測驗你是否記得 np.linalg.svd(A),並理解它回傳三個值。
  2. s 是 1D 陣列:這是最容易犯錯的地方。NumPy 的 s 是一維陣列,重建時必須用 np.diag(s) 將其轉回對角矩陣。
  3. 降維邏輯:測驗你是否理解奇異值是按大小排列的,取前 k 個即代表保留最重要的資訊。
  4. 維度對齊:在重建時,必須確保 Uk​ 的欄數與 Σk​ 的列數一致,這能檢驗你的矩陣運算基礎。

奇異值的重要性矩陣相乘的維度決定的:

  1. 資訊重要性(排序): 在 SVD 中,奇異值(Σ)是按照由大到小排列的。前 k 個奇異值代表了資料中最重要的特徵。為了配合這前 k 個最重要的數值,我們必須對應地取 U 的 k 與 VT 的 k
  2. 矩陣相乘維度(Math Logic): 為了重組成近似原矩陣的形狀 (m,n),維度必須對齊:
    • Uk​ 的形狀為 (m,k)(取前 k 欄)
    • Σk​ 的形狀為 (k,k)
    • VkT​ 的形狀為 (k,n)(取前 k 列) 這樣相乘 (m×k)⋅(k×k)⋅(k×n) 之後,結果才會回到原來的 (m,n)。

np.diag:
500

Powered by Forestry.md