R中的奇异值分解 - 来自svd()

时间:2017-03-10 21:51:26

标签: r svd

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

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。为什么呢?

1 个答案:

答案 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不会返回这些值。