使用 R 的奇异值分解 (SVD)

Singular Values Decomposition (SVD) with R

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

但与 the usual statement of the SVD theorem 不同,v 不是 4x4 矩阵(应该是!):

dim(v)   # (4,3)

为什么会这样?

根据定理,

这只是一个不同的约定,不同的 systems/textbooks 将以一种或另一种方式定义 SVD。重要的是酉属性U*U'=I。在任一约定中,奇异向量将最小化投影中的最小二乘距离。

这是理论的发展,其维度约定与 LINPACK 和 R 中的相同:https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter.pdf

要获得完整的 UV 矩阵,请使用 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

第二部分:

diag(c(svd(A)$d,0),nrow=3,ncol=4)