矩陣分解在機(jī)器學(xué)習(xí)應(yīng)用中的重要性無(wú)需多言,。本文對(duì)適用范圍很廣的奇異值分解方法進(jìn)行了介紹,,并通過(guò)代碼演示說(shuō)明了其工作方式、計(jì)算方法及其常見(jiàn)的幾種基礎(chǔ)應(yīng)用,。 矩陣分解也叫矩陣因子分解,涉及到用給定矩陣的組成元素描述該矩陣,。 奇異值分解(SVD)可能是最著名和使用最廣泛的矩陣分解方法,。所有矩陣都有一種 SVD 方法,這使得其比特征分解(eigendecomposition)等其它方法更加穩(wěn)定,。因此,,這種方法在很多應(yīng)用中都有應(yīng)用,包括壓縮,、去噪,、數(shù)據(jù)壓縮。 在這份教程中,,你將了解用于將矩陣分解成其組成元素的奇異值分解方法,。 在完成本教程后,你將了解: ·奇異值分解是什么以及涉及什么 ·如何計(jì)算 SVD 以及如何根據(jù) SVD 元素重建矩形和方形矩陣 ·如何使用 SVD 計(jì)算偽逆和執(zhí)行降維 那就開始吧,! 教程概覽 本教程分為 5 部分,,依次為: 1. 奇異值分解 2. 計(jì)算奇異值分解 3. 根據(jù) SVD 重建矩陣 4. 用于偽逆的 SVD 5. 用于降維的 SVD 奇異值分解 奇異值分解(SVD)是一種用于將矩陣歸約成其組成部分的矩陣分解方法,以使后面的某些矩陣計(jì)算更簡(jiǎn)單,。 為了說(shuō)明簡(jiǎn)單,,我們將關(guān)注用于實(shí)數(shù)值矩陣的 SVD,而會(huì)忽略復(fù)數(shù)矩陣的情況,。 其中 A 是我們希望分解的 n×m 的實(shí)矩陣,,U 是一個(gè) m×m 矩陣,Sigma(通常用大寫的希臘字母 ∑表示)是一個(gè) m×n 的對(duì)角矩陣,,V^T 是一個(gè) n×n 矩陣的轉(zhuǎn)置,,其中 T 是上標(biāo)。 奇異值分解是線性代數(shù)的一個(gè)亮點(diǎn),。 ——《__Introduction to Linear Algebra__ (http:///2AZ7R8j)》第五版,,2016 年,第 371 頁(yè) Sigma 矩陣中的對(duì)角值被稱為原始矩陣 A 的奇異值,。U 矩陣的列被稱為 A 的左奇異向量,,V 的列被稱為 A 的右奇異向量,。 SVD 是通過(guò)迭代式的數(shù)值方法計(jì)算的。我不會(huì)詳細(xì)深入這些方法的細(xì)節(jié),。每一個(gè)矩形矩陣都有一個(gè)奇異值分解,,盡管所得到的矩陣可能包含復(fù)數(shù)值以及浮點(diǎn)算術(shù)的局限性可能會(huì)導(dǎo)致某些矩陣無(wú)法簡(jiǎn)單利落地完成分解。 奇異值分解(SVD)提供了另一種將矩陣分解成奇異向量和奇異值的方式,。SVD 讓我們可以發(fā)現(xiàn)某些與特征分解同種類型的信息,。但是,SVD 有更廣的適用性,。 ——《Deep Learning》,,2016 年,第 44-45 SVD 在矩陣求逆等其它矩陣運(yùn)算的計(jì)算有廣泛的應(yīng)用,,但也可用作機(jī)器學(xué)習(xí)中的數(shù)據(jù)歸約方法,。SVD 也可用在最小二乘線性回歸、圖像壓縮和數(shù)據(jù)去噪中,。 奇異值分解(SVD)在統(tǒng)計(jì)學(xué),、機(jī)器學(xué)習(xí)和計(jì)算機(jī)科學(xué)領(lǐng)域有很多應(yīng)用。將 SVD 應(yīng)用于矩陣就像是使用 X 射線進(jìn)行透視…… ——《No Bullshit Guide To Linear Algebra》,,2017 年,,第 297 頁(yè) 計(jì)算奇異值分解 SVD 可以通過(guò)調(diào)用 svd() 函數(shù)進(jìn)行計(jì)算。 該函數(shù)在處理矩陣后會(huì)返回 U,、Sigma 和 V^T 元素,。Sigma 對(duì)角矩陣是按奇異值向量的形式返回的。V 矩陣是以轉(zhuǎn)置后的形式返回的,,比如 V.T. 下面的示例定義了一個(gè) 3×2 矩陣并計(jì)算了奇異值分解,。 運(yùn)行這個(gè)示例,首先會(huì)顯示定義的 3×2 矩陣,,然后會(huì)顯示分解計(jì)算得到的 3×3 的 U 矩陣,、2 個(gè)元素的 Sigma 向量和 2×3 的 V^T 矩陣元素。 根據(jù) SVD 重建矩陣 原始矩陣可以根據(jù) U,、Sigma 和 V^T 元素重建出來(lái),。 svd() 返回的 U、s 和 V 元素不能直接相乘,。 s 向量必須使用 diag() 函數(shù)轉(zhuǎn)換成對(duì)角矩陣,。默認(rèn)情況下,這個(gè)函數(shù)將創(chuàng)建一個(gè)相對(duì)于原來(lái)矩陣的 m×m 的方形矩陣,。這是有問(wèn)題的,,因?yàn)樵摼仃嚨某叽绮⒉环暇仃嚦朔ǖ囊?guī)則,即一個(gè)矩陣的列數(shù)必須等于后一個(gè)矩陣的行數(shù)。 在創(chuàng)建了方形的 Sigma 對(duì)角矩陣之后,,各個(gè)矩陣的大小與我們分解的原始 n×m 矩陣是相關(guān)的,,如下: 而事實(shí)上我們需要: 我們可以通過(guò)創(chuàng)建一個(gè)全是 0 值的 m×n 的新 Sigma 矩陣(比如:更多行)并使用通過(guò) diag() 計(jì)算得到的方形對(duì)角矩陣來(lái)填充矩陣的前 n×n 部分。 運(yùn)行這個(gè)示例,,首先會(huì)顯示原始矩陣,,然后會(huì)顯示根據(jù) SVD 元素重建的矩陣。 上面使用 Sigma 對(duì)角矩陣的復(fù)雜之處僅存在于 m 和 n 不相等的情況中,。當(dāng)重建一個(gè)方形矩陣時(shí),,其對(duì)角矩陣可以直接使用,如下,。 運(yùn)行這個(gè)示例會(huì)顯示原來(lái)的 3×3 矩陣和根據(jù) SVD 元素直接重建的版本,。 用于偽逆的 SVD 偽逆(pseudoinverse)是將方形矩陣的矩陣求逆泛化應(yīng)用到行數(shù)和列數(shù)不相等的矩形矩陣上。 這也被稱為廣義逆(Generalized Inverse)或摩爾-彭若斯逆(Moore-Penrose Inverse)——得名于兩位獨(dú)立發(fā)現(xiàn)該方法的研究者,。 矩陣求逆不是為非方形矩陣定義的,。[...] 當(dāng) A 的列數(shù)大于行數(shù)時(shí),那么使用偽逆求解線性方程是眾多解決方案中的一種,。 ——《Deep Learning》,2016 年,,第 46 頁(yè) 偽逆表示為 A^+,,其中 A 是被求逆的矩陣,+ 是上標(biāo),。 偽逆是使用 A 的奇異值分解計(jì)算的: 或者,,沒(méi)有點(diǎn)符號(hào): 其中 A^+ 是 A 的偽逆,D^+ 是對(duì)角矩陣 Sigma 的偽逆,,U^T 是 U 的轉(zhuǎn)置,。 我們可以根據(jù) SVD 運(yùn)算得到 U 和 V。 根據(jù) Sigma 創(chuàng)建一個(gè)對(duì)角矩陣,,計(jì)算 Sigma 中每個(gè)非零元素的倒數(shù),,然后如果原始矩陣是矩形的就取其轉(zhuǎn)置,就可以計(jì)算得到 D^+,。 偽逆提供了一種求解線性回歸方程的方法,,尤其是當(dāng)行數(shù)多于列數(shù)時(shí),而這也是很常見(jiàn)的情況,。 NumPy 提供了函數(shù) pinv() 來(lái)計(jì)算矩形矩陣的偽逆,。 下面的示例定義了一個(gè) 4×2 的矩陣并計(jì)算了其偽逆。 運(yùn)行這個(gè)示例,,首先顯示定義的矩陣,,然后顯示計(jì)算出的偽逆。 我們可以通過(guò) SVD 采用人工的方式計(jì)算偽逆,并將結(jié)果與 pinv() 函數(shù)的結(jié)果進(jìn)行比較,。 首先我們必須計(jì)算 SVD,。然后我們必須計(jì)算 s 數(shù)組中每個(gè)值的倒數(shù)。然后將這個(gè) s 數(shù)組轉(zhuǎn)換成一個(gè)對(duì)角矩陣,,它額外增加了一行 0 以使其變成矩形形式,。最后,我們可以根據(jù)這些元素計(jì)算偽逆,。 具體實(shí)現(xiàn)方式為: 下面列出了完整的示例,。 運(yùn)行這個(gè)示例,首先顯示定義的矩形矩陣,,然后顯示其偽逆,,結(jié)果與上面 pinv() 函數(shù)的結(jié)果一致。 用于降維的 SVD SVD 的一大常見(jiàn)應(yīng)用是降維,。 具有大量特征的數(shù)據(jù)(比如特征數(shù)(列數(shù))多于觀察數(shù)(行數(shù)))也許可以被歸約成與所涉預(yù)測(cè)問(wèn)題最相關(guān)的更小特征子集,。 其結(jié)果是一個(gè)秩更低的矩陣,據(jù)說(shuō)接近原始矩陣,。 為了做到這一點(diǎn),,我們可以在原來(lái)的數(shù)據(jù)上執(zhí)行一次 SVD 操作并選擇 Sigma 中前 k 個(gè)最大的奇異值。這些列可以從 Sigma 中選擇得到,,行可以從 V^T 中選擇得到,。 然后可以重建原始向量 A 的近似 B。 在自然語(yǔ)言處理中,,這種方法可以被用在文檔中詞出現(xiàn)情況或詞頻的矩陣上,,并被稱為隱含語(yǔ)義分析(Latent Semantic Analysis)或隱含語(yǔ)義索引(Latent Semantic Indexing)。 在實(shí)踐中,,我們可以保留和使用被稱為 T 的描述性數(shù)據(jù)子集,。這是矩陣的密集總結(jié)或投射。 此外,,這種變換既可以在原來(lái)的矩陣 A 上計(jì)算和應(yīng)用,,也可以在其它類似的矩陣上計(jì)算和應(yīng)用。 下面的示例是使用 SVD 的數(shù)據(jù)歸約,。 首先定義一個(gè) 3×10 的矩陣,,其列數(shù)多于行數(shù)。然后計(jì)算 SVD 并且只選取其前兩個(gè)特征,。這些元素再重新結(jié)合起來(lái),,得到原始矩陣的準(zhǔn)確再現(xiàn)。最后計(jì)算轉(zhuǎn)換的方式有兩種,。 運(yùn)行這個(gè)示例,,首先顯示定義的矩陣,然后是重建的近似矩陣,然后是原始矩陣的兩個(gè)同樣的變換結(jié)果,。 scikit-learn 提供了直接實(shí)現(xiàn)這種功能的 TruncatedSVD 類,。 TruncatedSVD 的創(chuàng)建必須指定所需的特征數(shù)或所要選擇的成分?jǐn)?shù),比如 2,。一旦創(chuàng)建完成,,你就可以通過(guò)調(diào)用 fit() 函數(shù)來(lái)擬合該變換(比如:計(jì)算 V^Tk),然后再通過(guò)調(diào)用 transform() 函數(shù)將其應(yīng)用于原始矩陣,。結(jié)果得到上面被稱為 T 的 A 的變換,。 下面的示例演示了 TruncatedSVD 類。 運(yùn)行這個(gè)示例,,首先顯示定義的矩陣,,然后是該矩陣變換后的版本。 可以看到,,結(jié)果得到的值與上面人工計(jì)算的結(jié)果一致,,但某些值的符號(hào)不一樣。由于所涉及的計(jì)算的性質(zhì)以及所用的基礎(chǔ)庫(kù)和方法的差異,,可以預(yù)見(jiàn)在符號(hào)方面會(huì)存在一些不穩(wěn)定性,。只要對(duì)該變換進(jìn)行訓(xùn)練以便復(fù)用,這種不穩(wěn)定性在實(shí)踐中應(yīng)該不成問(wèn)題,。
|
|
來(lái)自: 曉耀 > 《電子機(jī)械化工》