SVD与R很好地配合:
A = matrix(1:12,3,4)
A
u = svd(A)$u
v = svd(A)$v
sigma = diag(svd(A)$d)
u %*% sigma %*% t(v) # = A as desired但与SVD定理的常用表述不同,v是而不是 4x4矩阵(应该是!):
dim(v) # (4,3)为什么会这样?
根据这个定理,
v应该是格式(4,4),sigma应该是格式(3,4)。
顺便问一下,为了格式(3,4),创建一个diag(svd(A)$d)零填充的最短方式是什么?发布于 2015-11-24 16:37:12
要获得完整的U和V矩阵,可以使用nu=和nv=参数来svd()。若要使用零填充对角线矩阵,请使用nrow=和ncol=参数对diag()。
A <- matrix(1:12,3,4)
D <- svd(A, nu=nrow(A), nv=ncol(A))
u <- D$u
v <- D$v
sigma <- diag(D$d, nrow=nrow(A), ncol=ncol(A))
## Check that that worked:
dim(u)
# [1] 3 3
dim(v)
# [1] 4 4
dim(sigma)
# [1] 3 4
u %*% sigma %*% t(v)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12发布于 2015-11-24 16:32:18
这只是一个不同的惯例,不同的系统/教科书将定义SVD的一种或另一种方式。重要的是幺正性U*U'=I。在这两种惯例中,奇异向量都会使投影中最小二乘距离最小化。
下面是一个理论的发展,它具有与LINPACK和R:https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter.pdf相同的维度约定
发布于 2015-11-24 16:40:23
第二部分:
diag(c(svd(A)$d,0),nrow=3,ncol=4)https://stackoverflow.com/questions/33898482
复制相似问题