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)))
当A.shape == (m,n)
时,数组U和VT的默认形状为和(m,m)和(n,n)。我注意到有一个我期望的选项(full_matrices
),例如:
我无法理解的是为什么U和VT永远需要分别为(m,m)和(n,n)?当相乘时,由于s_diag是“对角线”,因此U和VT的唯一部分无论如何,使用的VT表更小...(例如,在示例中,U的大小可能仅为100,2 ...)
答案 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还有许多其他用途,例如查找伪逆表。