非方阵上的 SVD

SVD on a non-square matrix

我正在使用 numpy.linalg.svd() 来获取矩阵的奇异值分解。但是我无法从非方矩阵的分解返回到原始矩阵。

例如,对于方阵:

import numpy as np
n=5
# make a random (n,n) matrix
A= np.reshape( np.random.random_integers(0, 9, size= n**2), (n, n))
#SVD 
U,S,Vh = np.linalg.svd(A) 
# to get A from the SVD back
A_svd = U@np.diag(S)@Vh
#check if its the same 
print(np.allclose(A,A_svd))

我得到: >>> True

现在对于一个非方阵,比如A的形状是(m,n),那么形状U是(m,m),形状V是(n,n),S是对角矩阵的(长度为 k),其中 k = min(m,n)。例如:

import numpy as np
n=5
m= 8
# make a random (m,n) matrix
A= np.reshape( np.random.random_integers(0, 9, size= m*n), (m, n))
#SVD 
U,S,Vh = np.linalg.svd(A) 

具有以下形状:

>>> U.shape
(8, 8)
>>> S.shape
(5,)
>>> Vh.shape
(5, 5)

如果我有 svd 分解,我不知道如何取回矩阵 A。 由于形状不同,我无法进行简单的乘法运算。 U@np.diag(S)@Vh np.matmul(U,S,Vh)np.dot。 所以我尝试重塑 S 并用零填充它。

S_m = np.diag(S) 
S_m.resize((U.shape[1], Vh.shape[0]))
#check if its the same 
print(np.allclose(A,U @S_m@ Vh))
>>> False

我从 scipy.linalg 中找到了答案 here, using diagsvd

import scipy.linalg as la    
A_svd = U@la.diagsvd(S,*A.shape)@Vh