特征值未定义于矩形矩阵中,但奇异值与其相关。至于特征向量,您总是拥有一组右特征向量和左特征向量,这些向量跨越列空间和行空间。
SVD与
MM'
和
M'M
的特征值分解相关。
M'M = V (S'S) V'
MM' = U (SS') U'
现在,
V
的列是M'M
的特征向量,在您的情况下大小为(17 x 17)
。因此,V
为(17 x 17)
U
的列是MM'
的特征向量,在您的情况下大小为(400 x 400)
。因此,U
为(400 x 400)
现在,
S
的大小是多少?
S
(奇异值)的非零元素是
M'M
和
MM'
的非零特征值的平方根。可以证明这两个特征值具有相同的非零特征值集合,因此在第一种情况下,
S
为
(17 x 17)
,在第二种情况下为
(400 x 400)
。那么我们如何将其与我们的SVD
M = USV'
协调一致呢?我们构建一个
矩形对角矩阵(400 x 17)
,其中包含17个非零特征值的平方根。
您可以使用scipy
中的SVD:
import scipy
u, s, vh = scipy.linalg.svd(M, full_matrices=True)
print(u.shape, s.shape, vh.shape)
那给
((400, 400), (17,), (17, 17))
将您的 S
设置为 (400 x 17)
:
s = np.concatenate([np.diag(s), np.zeros((400-17, 17))], axis=0)
检查SVD正确性:
res = u@s@vh
np.allclose(res, a)
True
低秩矩阵逼近
有时候你想用秩为r
的低秩矩阵M_tilde
来逼近矩阵M
,在这种情况下,如果你想要最小化两者之间的Frobenius范数,你只需要保留r
个最大的奇异值(Eckhart-Young定理)。U, S, V
的大小变为:(400 x r), (r x r), (r x 17)
,其中S
是对角线矩阵。
我不知道你使用的是哪个函数,但是这就是发生的事情:零奇异值被抛弃了,因为一个(m x n)
的矩阵最多只能有秩min(m, n)
(在你的情况下是17)。