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]
我想设置
而不是默认输入值
- nu = 行数
- nv = 列数
所以我运行
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 包括找到一些矩阵 U、D、V 使得 X = UDV',其中 D 是对角线,U, V 是正交的。 U 的列是 X 的 space 列的正交基,而 V 是 X 行 space 的正交基。如果 X 是 n × m,秩为 r,从线性代数我们知道 r 是线性独立列的数量,与线性独立行的数量相同。因此 U 必须是 n x r 和 V m x r。因此 D 是对角线 r x r.
在SVD的另一个版本中,U和V是用左零的正交基完成的space和 X 的 null space。在这种情况下,U和V是方阵,n x n 和 m x m,并且 D 是 n x m 因此不再是对角线。非对角线 D 矩阵中的额外条目为零。因为额外的奇异值没有什么意义(因为它们都是零)所以函数 svd
.
不会返回这些值
在 svd()
函数的 R 文档中,底部有一个示例。
hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") }
X <- hilbert(9)[, 1:6]
我想设置
而不是默认输入值- nu = 行数
- nv = 列数
所以我运行
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 包括找到一些矩阵 U、D、V 使得 X = UDV',其中 D 是对角线,U, V 是正交的。 U 的列是 X 的 space 列的正交基,而 V 是 X 行 space 的正交基。如果 X 是 n × m,秩为 r,从线性代数我们知道 r 是线性独立列的数量,与线性独立行的数量相同。因此 U 必须是 n x r 和 V m x r。因此 D 是对角线 r x r.
在SVD的另一个版本中,U和V是用左零的正交基完成的space和 X 的 null space。在这种情况下,U和V是方阵,n x n 和 m x m,并且 D 是 n x m 因此不再是对角线。非对角线 D 矩阵中的额外条目为零。因为额外的奇异值没有什么意义(因为它们都是零)所以函数 svd
.