【簡化資料】奇異值分解 SVD
阿新 • • 發佈:2018-11-15
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
【簡化資料】奇異值分解(SVD)
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/42214205
1、簡介
奇異值分解(singular Value Decomposition),簡稱SVD,線性代數中矩陣分解的方法。假如有一個矩陣A,對它進行奇異值分解,可以得到三個矩陣:
這三個矩陣的大小:
矩陣sigma(即上圖U和V中間的矩陣)除了對角元素不為0,其他元素都為0,並且對角元素是從大到小排列的,前面的元素比較大,後面的很多元素接近0。這些對角元素就是奇異值。
sigma中有n個奇異值,但是由於排在後面的很多接近0,所以我們可以僅保留比較大的r個奇異值:
實際應用中,我們僅需保留著三個比較小的矩陣,就能表示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)>>> Umatrix([[-0.3863177 , -0.92236578], [-0.92236578, 0.3863177 ]])>>> sigmaarray([ 9.508032 , 0.77286964])>>> VTmatrix([[-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)及其應用