1. 程式人生 > >【簡化資料】奇異值分解 SVD

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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.922365780.3863177 ]])>>> sigmaarray([ 9.508032  ,  0.77286964])>>> VTmatrix([[-0.42866713, -0.56630692, -0.7039467 ],        [ 0.805963910.11238241, -0.58119908],        [ 0.40824829, -0.816496580.40824829]])

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



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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述