scipy.linalg.svd将“任意”数组A分解为U,s,VT
一个例子是:

from numpy import array
from scipy.linalg import svd
import numpy as np

# define a matrix
A = np.arange(200).reshape((100,2))
print ('A.shape',A.shape)
U, s, VT = svd(A)
print ('U.shape',U.shape)
print ('s.shape',s.shape)
print ('VT.shape',VT.shape)
s_diag = np.zeros((100,2))
np.fill_diagonal(s_diag, s)
print(np.allclose(A,np.dot(np.dot(U,s_diag),VT)))


python - scipy.linalg.svd:VT和U的形状:full_matrices是什么,为什么需要它?-LMLPHP .png

当为A.shape == (m,n)时,数组U和VT的默认形状为和(m,m)和(n,n)。我注意到有一个我期望的选项(full_matrices),例如:
python - scipy.linalg.svd:VT和U的形状:full_matrices是什么,为什么需要它?-LMLPHP
我不明白的是为什么U和VT永远需要分别为(m,m)和(n,n)?进行乘法运算时,由于s_diag是“对角线”,因此使用的U和VT表的唯一部分还是较小的(例如,在示例中,U的大小可能仅为100,2 ...)

最佳答案

经过一些wikipedia reading和一些数学回忆后,事实证明这是有理由的……

因此,第一个显而易见的原因是,取决于哪个较小,m或n,其中一个表无论如何都需要是满的。

现在在数学理论中,数学原因是U和VT均为orthonormal,这意味着np.dot(U,U.T)等于np.dot(U.T,U)等于单位矩阵。 VT同样如此。因此它们的形状为(m,m)和(n,n)

这对于我想进行三维还原的情况似乎没有用,但是SVD还有许多其他用途,例如查找伪逆表。

关于python - scipy.linalg.svd:VT和U的形状:full_matrices是什么,为什么需要它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54987801/

10-11 19:45