R中的奇异值分解

时间:2016-10-22 11:32:43

标签: r svd

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矩阵,如维基百科页面(以及该主题的其他页面)。

所以,我有点困惑......

2 个答案:

答案 0 :(得分:5)

默认情况下,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))

答案 1 :(得分:0)

我的知识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