from http://blog.csdn.net/u012162613/article/details/422142052014-12-28 15:28
【簡化數(shù)據(jù)】奇異值分解(SVD)
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/42214205
1、簡介
奇異值分解(singular Value Decomposition),簡稱SVD,線性代數(shù)中矩陣分解的方法。假如有一個矩陣A,對它進行奇異值分解,可以得到三個矩陣:
這三個矩陣的大小:
矩陣sigma(即上圖U和V中間的矩陣)除了對角元素不為0,其他元素都為0,并且對角元素是從大到小排列的,前面的元素比較大,后面的很多元素接近0。這些對角元素就是奇異值。
sigma中有n個奇異值,但是由于排在后面的很多接近0,所以我們可以僅保留比較大的r個奇異值:
實際應用中,我們僅需保留著三個比較小的矩陣,就能表示A,不僅節(jié)省存儲量,在計算的時候更是減少了計算量。SVD在信息檢索(隱性語義索引)、圖像壓縮、推薦系統(tǒng)、金融等領域都有應用。
在上一篇文章
2、在python中使用SVD
numpy中的linalg已經(jīng)實現(xiàn)了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是非常大的矩陣時,只返回奇異值可以節(jié)省很大的存儲空間。當然,如果我們要重構A,就必須先將sigma轉化為矩陣。
推薦文章,也是本文參考的一篇文章:機器學習中的數(shù)學(5)-強大的矩陣奇異值分解(SVD)及其應用
|