Python scipy.linalg.svd:VT和U的形状:什么是完整矩阵?为什么需要它?

Python scipy.linalg.svd:VT和U的形状:什么是完整矩阵?为什么需要它?,python,scipy,svd,Python,Scipy,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

将“任意”数组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)))
.png

当A.shape==(m,n)时,数组U和VT的默认形状是and(m,m)和(n,n)。我注意到有一个选项(
full_matrix
)可以满足我的期望,例如: 我无法理解的是为什么U和VT需要是(m,m)和(n,n)?当相乘时,因为s_diag是一个“对角线”,所以U和VT表中使用的唯一部分是较小的部分。。。(例如,在本例中,U的大小可能仅为100,2…)

经过一些数学回忆,结果证明,这有一个合理的理由如此

所以,第一个明显的原因是,取决于哪个表更小,m或n,其中一个表无论如何都需要满

现在数学的原因是在数学理论中,U和VT都是,意思是,
np。点(U,U.T)
等于
np。点(U.T,U)
等于单位矩阵。同样适用于VT。因此它们的形状为(m,m)和(n,n)


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

感谢您回答自己的问题,我对这个答案非常感兴趣。