转载自: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)就是上面的左奇异值。