R 中的奇异值分解 - 来自 svd() 的奇异值数量有限

Singular value decomposition in R - limited number of singular values from svd()

svd() 函数的 R 文档中,底部有一个示例。

hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") }
X <- hilbert(9)[, 1:6]

我想设置

而不是默认输入值

所以我运行

s = svd(X, nu = dim(X)[1], nv = dim(X)[2])

这里是 "s".

中矩阵的维数
> str(s)
List of 3
 $ d: num [1:6] 1.67 2.77e-01 2.22e-02 1.08e-03 3.24e-05 ...
 $ u: num [1:9, 1:9] -0.724 -0.428 -0.312 -0.248 -0.206 ...
 $ v: num [1:6, 1:6] -0.736 -0.443 -0.327 -0.263 -0.22 ...

我预计 d 的长度为 9,但实际长度为 6。为什么?

SVD 有两个版本。矩阵的简单 SVD 包括找到一些矩阵 UDV 使得 X = UDV',其中 D 是对角线,UV 是正交的。 U 的列是 X 的 space 列的正交基,而 VX 行 space 的正交基。如果 Xn × m,秩为 r,从线性代数我们知道 r 是线性独立列的数量,与线性独立行的数量相同。因此 U 必须是 n x rV m x r。因此 D 是对角线 r x r.

在SVD的另一个版本中,UV是用左零的正交基完成的space和 X 的 null space。在这种情况下,UV是方阵,n x nm x m,并且 Dn x m 因此不再是对角线。非对角线 D 矩阵中的额外条目为零。因为额外的奇异值没有什么意义(因为它们都是零)所以函数 svd.

不会返回这些值