numpy.linalg.svd函數


轉載自:python之SVD函數介紹
函數:np.linalg.svd(a,full_matrices=1,compute_uv=1)
參數:

  • a是一個形如\((M,N)\)的矩陣
  • full_matrices的取值為0或者1,默認值為1,這時u的大小為\((M,M)\),v的大小為\((N,N)\) 。否則u的大小為\((M,K)\),v的大小為\((K,N)\)\(K=min(M,N)\)
  • compute_uv的取值是為0或者1,默認值為1,表示計算u,s,v。為0的時候只計算s。

返回值:

  • 總共有三個返回值u,s,v
  • u大小為\((M,M)\),s大小為\((M,N)\),v大小為\((N,N)\)
  • \(A=u*s*v\)
  • 其中s是對矩陣a的奇異值分解。s除了對角元素不為0,其他元素都為0,並且對角元素從大到小排列。s中有n個奇異值,一般排在后面的比較接近0,所以僅保留比較大的r個奇異值。

舉例:

from numpy import *
data = mat([[1,2,3],[4,5,6]])
U,sigma,VT = np.linalg.svd(data)
print U
[[-0.3863177  -0.92236578]
 [-0.92236578  0.3863177 ]]
print sigma
[9.508032   0.77286964]
print VT
[[-0.42866713 -0.56630692 -0.7039467 ]
 [ 0.80596391  0.11238241 -0.58119908]
 [ 0.40824829 -0.81649658  0.40824829]]

因為sigma是除了對角元素不為0,其他元素都為0。所以返回的時候,作為一維矩陣返回。本來sigma應該是由3個值的,但是因為最后一個值為0,所以直接省略了。

關於奇異值:

  • 對於方陣而言,\(A=QQ^{-1}\),其中\(Q\)為特征向量。但不是方陣的矩陣沒有特征向量。
  • 非方陣矩陣可以用奇異值分解描述矩陣。\(A=USV^T\),其中U叫做左奇異值,S叫做奇異值,V叫做右奇異值。因為\(S\)只有對角線的數不為0,並且數值是從大到小排列,所以一般只取r個。r的值越接近\(A\)的列數,那么三個矩陣的乘法得到的矩陣越接近\(A\)
  • 因為三個矩陣的面積之和遠遠小於原矩陣\(A\),所以當\(A\)是很大的矩陣,我們向壓縮空間表達\(A\)的時候,可以使用這三個矩陣。
  • \(A\)不是矩陣時,把\(A\)轉置成\(A^T\)。且\((AA^T)v =\lambda v\),其中\(v\)是右奇異值,\(\partial v = \sqrt \lambda\),這里的\(\partial\)就是上述的奇異值。\(u=\frac {Av} {\partial}\)\(u\)就是上面的左奇異值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM