天天看點

【簡化資料】奇異值分解(SVD)【簡化資料】奇異值分解(SVD)

【簡化資料】奇異值分解(SVD)

@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/42214205

1、簡介

奇異值分解(singular Value Decomposition),簡稱SVD,線性代數中矩陣分解的方法。假如有一個矩陣A,對它進行奇異值分解,可以得到三個矩陣:

【簡化資料】奇異值分解(SVD)【簡化資料】奇異值分解(SVD)

這三個矩陣的大小:

【簡化資料】奇異值分解(SVD)【簡化資料】奇異值分解(SVD)

矩陣sigma(即上圖U和V中間的矩陣)除了對角元素不為0,其他元素都為0,并且對角元素是從大到小排列的,前面的元素比較大,後面的很多元素接近0。這些對角元素就是奇異值。

sigma中有n個奇異值,但是由于排在後面的很多接近0,是以我們可以僅保留比較大的r個奇異值:

【簡化資料】奇異值分解(SVD)【簡化資料】奇異值分解(SVD)

實際應用中,我們僅需保留着三個比較小的矩陣,就能表示A,不僅節省存儲量,在計算的時候更是減少了計算量。SVD在資訊檢索(隐性語義索引)、圖像壓縮、推薦系統、金融等領域都有應用。

在上一篇文章主成分分析中,我是通過特征值分解的方法來實作PCA的,除了特征值分解,還可以用奇異值分解來實作PCA。特征值和奇異值二者之間是有關系的:上面我們由矩陣A獲得了奇異值sigma(i),假如方陣A*A'的特征值為lamda(i),則:sigma(i)^2=lamda(i)。可以發現,求特征值必須要求矩陣是方陣,而求奇異值對任意矩陣都可以,是以PCA的實作其實用SVD的更多,在scikit-learn中,PCA算法其實也是通過SVD來實作的。

2、在python中使用SVD

numpy中的linalg已經實作了SVD,可以直接調用

>>> A=mat([[1,2,3],[4,5,6]])
>>> from numpy import linalg as la
>>> U,sigma,VT=la.svd(A)
>>> U
matrix([[-0.3863177 , -0.92236578],
        [-0.92236578,  0.3863177 ]])
>>> sigma
array([ 9.508032  ,  0.77286964])
>>> VT
matrix([[-0.42866713, -0.56630692, -0.7039467 ],
        [ 0.80596391,  0.11238241, -0.58119908],
        [ 0.40824829, -0.81649658,  0.40824829]])
           

有一點需要注意,sigma本來應該跟A矩陣的大小2*3一樣,但linalg.svd()隻傳回了一個行向量的sigma,并且隻有2個奇異值(本來應該有3個),這是因為第三個奇異值為0,舍棄掉了。之是以這樣做,是因為當A是非常大的矩陣時,隻傳回奇異值可以節省很大的存儲空間。當然,如果我們要重構A,就必須先将sigma轉化為矩陣。

推薦文章,也是本文參考的一篇文章:機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用

繼續閱讀