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

时间:2019-03-04 16:46:27

标签: python scipy svd

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)))

enter image description here。png

A.shape == (m,n)时,数组U和VT的默认形状为和(m,m)和(n,n)。我注意到有一个我期望的选项(full_matrices),例如: enter image description here 我无法理解的是为什么U和VT永远需要分别为(m,m)和(n,n)?当相乘时,由于s_diag是“对角线”,因此U和VT的唯一部分无论如何,使用的VT表更小...(例如,在示例中,U的大小可能仅为100,2 ...)

1 个答案:

答案 0 :(得分:1)

经过wikipedia reading和一些数学回忆之后,事实证明,这样做是有道理的...

因此,第一个显而易见的原因是,根据哪个较小,m或n,其中一个表仍然需要装满。

现在在数学理论中,数学原因是U和VT均为orthonormal,这意味着Advantage等于; ini [default] KeyPairName = MyKey InstanceType = m1.micro # YAML --- - ParameterKey: KeyPairName ParameterValue: MyKey - ParameterKey: InstanceType ParameterValue: m1.micro json: [ { "ParameterKey": "KeyPairName", "ParameterValue": "MyKey" }, { "ParameterKey": "InstanceType", "ParameterValue": "m1.micro" } ] 等于单位矩阵。 VT同样如此。因此,它们的形状为(m,m)和(n,n)

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