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)就是上面的左奇异值。
原文地址:https://www.cnblogs.com/xym4869/p/11301727.html