在R的svd()
函数文档中,底部有一个例子。
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。为什么呢?
答案 0 :(得分:0)
SVD有两种版本。矩阵的简单SVD包括找到一些矩阵 U , D , V ,这样 X = UDV ',其中 D 是对角线, U , V 是正交的。 U 的列是 X 的列空间的正交基础,而 V 的列是行空间的正交基础。 X 。如果 X n × m 且等级为 r ,则从线性代数我们知道 r 是线性独立列的数量,与线性独立行的数量相同。因此, U 必须 n x r 和 V m x r 。因此 D 是对角 r x r 。
在另一个版本的SVD中, U 和 V 以左空白空间的正交基础和 X 分别。在这种情况下, U 和 V 是方形矩阵, n x n 和 m x m , D n x m 因此不再是对角线。非对角 D 矩阵中的额外条目为零。因为额外的奇异值没什么意义(因为它们都是零),函数svd
不会返回这些值。