非方阵上的 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
我正在使用 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