首頁 > AI資訊 > 最新資訊 > 奇異值分解簡介:從原理到基礎機器學習應用

奇異值分解簡介:從原理到基礎機器學習應用

新火種    2024-11-23

矩陣分解也叫矩陣因子分解,涉及到用給定矩陣的組成元素描述該矩陣。

奇異值分解(SVD)可能是最著名和使用最廣泛的矩陣分解方法。所有矩陣都有一種 SVD 方法,這使得其比特征分解(eigendecomposition)等其它方法更加穩定。因此,這種方法在很多應用中都有應用,包括壓縮、去噪、數據壓縮。

在這份教程中,你將了解用于將矩陣分解成其組成元素的奇異值分解方法。

在完成本教程后,你將了解:

  • 奇異值分解是什么以及涉及什么
  • 如何計算 SVD 以及如何根據 SVD 元素重建矩形和方形矩陣
  • 如何使用 SVD 計算偽逆和執行降維

那就開始吧!

教程概覽

本教程分為 5 部分,依次為:

1. 奇異值分解

2. 計算奇異值分解

3. 根據 SVD 重建矩陣

4. 用于偽逆的 SVD

5. 用于降維的 SVD

奇異值分解

奇異值分解(SVD)是一種用于將矩陣歸約成其組成部分的矩陣分解方法,以使后面的某些矩陣計算更簡單。

為了說明簡單,我們將關注用于實數值矩陣的 SVD,而會忽略復數矩陣的情況。

其中 A 是我們希望分解的 n×m 的實矩陣,U 是一個 m×m 矩陣,Sigma(通常用大寫的希臘字母 ∑表示)是一個 m×n 的對角矩陣,V^T 是一個 n×n 矩陣的轉置,其中 T 是上標。奇異值分解是線性代數的一個亮點。

——《Introduction to Linear Algebra》第五版,2016 年,第 371 頁

Sigma 矩陣中的對角值被稱為原始矩陣 A 的奇異值。U 矩陣的列被稱為 A 的左奇異向量,V 的列被稱為 A 的右奇異向量。 SVD 是通過迭代式的數值方法計算的。我不會詳細深入這些方法的細節。每一個矩形矩陣都有一個奇異值分解,盡管所得到的矩陣可能包含復數值以及浮點算術的局限性可能會導致某些矩陣無法簡單利落地完成分解。 奇異值分解(SVD)提供了另一種將矩陣分解成奇異向量和奇異值的方式。SVD 讓我們可以發現某些與特征分解同種類型的信息。但是,SVD 有更廣的適用性。

——《Deep Learning》,2016 年,第 44-45

SVD 在矩陣求逆等其它矩陣運算的計算有廣泛的應用,但也可用作機器學習中的數據歸約方法。SVD 也可用在最小二乘線性回歸、圖像壓縮和數據去噪中。 奇異值分解(SVD)在統計學、機器學習和計算機科學領域有很多應用。將 SVD 應用于矩陣就像是使用 X 射線進行透視……

——《No Bullshit Guide To Linear Algebra》,2017 年,第 297 頁

計算奇異值分解

SVD 可以通過調用 svd() 函數進行計算。

該函數在處理矩陣后會返回 U、Sigma 和 V^T 元素。Sigma 對角矩陣是按奇異值向量的形式返回的。V 矩陣是以轉置后的形式返回的,比如 V.T.

下面的示例定義了一個 3×2 矩陣并計算了奇異值分解。

運行這個示例,首先會顯示定義的 3×2 矩陣,然后會顯示分解計算得到的 3×3 的 U 矩陣、2 個元素的 Sigma 向量和 2×3 的 V^T 矩陣元素。

根據 SVD 重建矩陣

原始矩陣可以根據 U、Sigma 和 V^T 元素重建出來。

svd() 返回的 U、s 和 V 元素不能直接相乘。

s 向量必須使用 diag() 函數轉換成對角矩陣。默認情況下,這個函數將創建一個相對于原來矩陣的 m×m 的方形矩陣。這是有問題的,因為該矩陣的尺寸并不符合矩陣乘法的規則,即一個矩陣的列數必須等于后一個矩陣的行數。

在創建了方形的 Sigma 對角矩陣之后,各個矩陣的大小與我們分解的原始 n×m 矩陣是相關的,如下:

而事實上我們需要:

我們可以通過創建一個全是 0 值的 m×n 的新 Sigma 矩陣(比如:更多行)并使用通過 diag() 計算得到的方形對角矩陣來填充矩陣的前 n×n 部分。

運行這個示例,首先會顯示原始矩陣,然后會顯示根據 SVD 元素重建的矩陣。

上面使用 Sigma 對角矩陣的復雜之處僅存在于 m 和 n 不相等的情況中。當重建一個方形矩陣時,其對角矩陣可以直接使用,如下。

運行這個示例會顯示原來的 3×3 矩陣和根據 SVD 元素直接重建的版本。

用于偽逆的 SVD

偽逆(pseudoinverse)是將方形矩陣的矩陣求逆泛化應用到行數和列數不相等的矩形矩陣上。這也被稱為廣義逆(Generalized Inverse)或摩爾-彭若斯逆(Moore-Penrose Inverse),得名于兩位獨立發現該方法的研究者。

矩陣求逆不是為非方形矩陣定義的。[...] 當 A 的列數大于行數時,那么使用偽逆求解線性方程是眾多解決方案中的一種。

——《Deep Learning》,2016 年,第 46 頁

偽逆表示為 A^+,其中 A 是被求逆的矩陣,+ 是上標。

偽逆是使用 A 的奇異值分解計算的:

或者,沒有點符號:

其中 A^+ 是 A 的偽逆,D^+ 是對角矩陣 Sigma 的偽逆,U^T 是 U 的轉置。

我們可以根據 SVD 運算得到 U 和 V。

根據 Sigma 創建一個對角矩陣,計算 Sigma 中每個非零元素的倒數,然后如果原始矩陣是矩形的就取其轉置,就可以計算得到 D^+。

偽逆提供了一種求解線性回歸方程的方法,尤其是當行數多于列數時,而這也是很常見的情況。

NumPy 提供了函數 pinv() 來計算矩形矩陣的偽逆。

下面的示例定義了一個 4×2 的矩陣并計算了其偽逆。

運行這個示例,首先顯示定義的矩陣,然后顯示計算出的偽逆。

我們可以通過 SVD 采用人工的方式計算偽逆,并將結果與 pinv() 函數的結果進行比較。

首先我們必須計算 SVD。然后我們必須計算 s 數組中每個值的倒數。然后將這個 s 數組轉換成一個對角矩陣,它額外增加了一行 0 以使其變成矩形形式。最后,我們可以根據這些元素計算偽逆。

具體實現方式為:

下面列出了完整的示例。

運行這個示例,首先顯示定義的矩形矩陣,然后顯示其偽逆,結果與上面 pinv() 函數的結果一致。

用于降維的 SVD

SVD 的一大常見應用是降維。

具有大量特征的數據(比如特征數(列數)多于觀察數(行數))也許可以被歸約成與所涉預測問題最相關的更小特征子集。

其結果是一個秩更低的矩陣,據說接近原始矩陣。

為了做到這一點,我們可以在原來的數據上執行一次 SVD 操作并選擇 Sigma 中前 k 個最大的奇異值。這些列可以從 Sigma 中選擇得到,行可以從 V^T 中選擇得到。

然后可以重建原始向量 A 的近似 B。

自然語言處理中,這種方法可以被用在文檔中詞出現情況或詞頻的矩陣上,并被稱為隱含語義分析(Latent Semantic Analysis)或隱含語義索引(Latent Semantic Indexing)。

在實踐中,我們可以保留和使用被稱為 T 的描述性數據子集。這是矩陣的密集總結或投射。

此外,這種變換既可以在原來的矩陣 A 上計算和應用,也可以在其它類似的矩陣上計算和應用。

下面的示例是使用 SVD 的數據歸約。

首先定義一個 3×10 的矩陣,其列數多于行數。然后計算 SVD 并且只選取其前兩個特征。這些元素再重新結合起來,得到原始矩陣的準確再現。最后計算轉換的方式有兩種。

運行這個示例,首先顯示定義的矩陣,然后是重建的近似矩陣,然后是原始矩陣的兩個同樣的變換結果。

scikit-learn 提供了直接實現這種功能的 TruncatedSVD 類。

TruncatedSVD 的創建必須指定所需的特征數或所要選擇的成分數,比如 2。一旦創建完成,你就可以通過調用 fit() 函數來擬合該變換(比如:計算 V^Tk),然后再通過調用 transform() 函數將其應用于原始矩陣。結果得到上面被稱為 T 的 A 的變換。

下面的示例演示了 TruncatedSVD 類。

運行這個示例,首先顯示定義的矩陣,然后是該矩陣變換后的版本。

可以看到,結果得到的值與上面人工計算的結果一致,但某些值的符號不一樣。由于所涉及的計算的性質以及所用的基礎庫和方法的差異,可以預見在符號方面會存在一些不穩定性。只要對該變換進行訓練以便復用,這種不穩定性在實踐中應該不成問題。

原文鏈接:

相關推薦
免責聲明
本文所包含的觀點僅代表作者個人看法,不代表新火種的觀點。在新火種上獲取的所有信息均不應被視為投資建議。新火種對本文可能提及或鏈接的任何項目不表示認可。 交易和投資涉及高風險,讀者在采取與本文內容相關的任何行動之前,請務必進行充分的盡職調查。最終的決策應該基于您自己的獨立判斷。新火種不對因依賴本文觀點而產生的任何金錢損失負任何責任。

熱門文章