R中的奇异值分解

Singular value decomposition in R

example of wikipedia's page on SVD 之后,我在 R 中创建了以下矩阵:

M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2

从包 base:

中计算出 SVD
s <- svd(M)

然而,s$u 是一个 4x4 矩阵,s$v 是一个 5x4 矩阵,而 V 应该是一个 5x5 矩阵,如维基百科页面(以及有关该主题的其他页面)。

所以,我有点困惑..

我的知识 id 线性代数有点初级和尘土飞扬,但我认为这个满足 SVD 的所有条件。 SVD 只不过是将原始矩阵 M 分解为三个矩阵——一个对角矩阵 d 和两个正交矩阵 u 和 v,使得 M=udv' 所以唯一的限制是行数 v' 应该与 u*d

中的列数相同

代码如下:

M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2
M

ans<- svd(M)
u<- ans$u
v<- ans$v
d<- ans$d
#u %*% I(u)
u %*% t(u) #Ok, is orthogonal 
v %*% t(v) #OK, is orthogonal
d1<- diag(d)
d1

(u%*% d1) %*% t(v) # is same as M 
u%*% (d1 %*% t(v)) # is same as M 
M

默认情况下,R 不会计算所有奇异向量。 (阅读doc

如果你想计算所有这些,你可以使用 svd 的参数 nunv.

例如,在您的情况下:

s = svd(M, nv = 5)

检查:

dim(s$v)
# [1] 5 5

s$u %*% cbind(diag(s$d), rep(0,4)) %*% t(s$v)
# You get M.

更一般地说,您可以通过这种方式获得所有奇异向量:

s = svd(M, nu = nrow(M), nv = ncol(M))