SVD奇異值分解筆記

2021-10-03 05:41:40 字數 1950 閱讀 5675

奇異值分解(singular value decomposition)是機器學習領域廣泛應用的演算法,可以用於降維,推薦系統,自然語言處理等領域。

基本公式:

如上u,v是酉矩陣,酉矩陣定義為:

ax=λx(式-1)

如上式,a為n階矩陣,x為非零向量,λ為常數,則稱λ為a的特徵值,x為a的特徵向量

對於多個λ特徵值,則有乙個特徵向量矩陣,得到如下公式

如果不太了解特徵值和特徵向量概念,可以看如下鏈結,還有乙個例子,一看便一目了然

v又叫做右奇異矩陣,v實際上為矩陣

證明:上式證明使用了

將上式-3中,將左右同時乘以v矩陣,則有

上式是不是很熟悉了,參考式-2,證明了v為所有特徵向量構成的矩陣,

u又叫左奇異矩陣,u實際上為

這裡參考了 

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

其中k要比n小很多,也就是乙個大的矩陣a可以用三個小的矩陣

來表示。如下圖所示,現在我們的矩陣a只需要灰色的部分的三個小矩陣就可以近似描述了。

由於這個重要的性質,svd可以用於pca降維,來做資料壓縮和去噪。也可以用於推薦演算法,將使用者和喜好對應的矩陣做特徵分解,進而得到隱含的使用者需求來做推薦。同時也可以用於nlp中的演算法,比如潛在語義索引(lsi)。

這段參考:

from numpy import *

arr = array([ [1,2],[3,4],[5,6],[7,8] ])

u,sigma,vt = linalg.svd(arr)

print('u=')

print(u)

print('sigma=')

print(sigma)

print('sigma的維度')

print(sigma.shape)

print('vt=')

print(vt)

結果如下:u是乙個4行4列的矩陣,vt是2行2列的矩陣,sigma維度為2行2列,這裡理解是只顯示了對角線的值,非對角線上都為0。(根據svd公式應該是4行2列,後兩行為0來理解了)。

注意:在sigma中第乙個奇異值為14.2690955,遠大於後面的數,實際在在工程中,有這麼乙個事實:前10%或前1%的奇異值之和便很接近所有奇異值之和了,因此,選取某個數目r的奇異值就好了,這意味著資料集中僅有r個重要特徵,其餘的都是雜訊和冗餘,這便實現了乙個降維去噪的過程。

按下面的方式降維,假設奇異值只取第乙個14.2690995,則vt一篇文件中只以第乙個單詞,作為文件的代表。進而可以依次來計算相似度進行分類,

描述的可能不是太詳細,可以看看這篇文章:

奇異值分解 SVD

最近不小心接觸到了svd,然後認真看下去之後發現這東西真的挺強大的,把乙個推薦問題轉化為純數學矩陣問題,看了一些部落格,把乙個寫個比較具體的博文引入進來,給自己看的,所以把覺得沒必要的就去掉了,博文下面附原始部落格位址。一 基礎知識 1.矩陣的秩 矩陣的秩是矩陣中線性無關的行或列的個數 2.對角矩陣...

SVD奇異值分解

原文出處 今天我們來講講奇異值分解和它的一些有意思的應用。奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其...

奇異值分解(SVD)

svd是singular value decomposition的縮寫,是去除冗餘 資訊提取和資料約簡的強大工具。若a為p q實數矩陣,則存在p階正交矩陣u和q階正交矩陣v,使得 a u v 上式就是奇異值分解,其中p q矩陣 中,i,i 元素 i 0,i 1,2,3,min p,q 其他元素均為0...