我使用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)
我不知道如何得到矩阵A,但如果我有svd分解。由于形状的不同,我不能做简单的乘法。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
https://stackoverflow.com/questions/70668014
复制相似问题