使用 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)
为什么会这样?
根据定理,
v
应该是格式 (4,4),
sigma
应该是格式 (3,4).
顺便说一句,创建 diag(svd(A)$d)
零填充格式 (3,4) 的最短方法是什么?
这只是一个不同的约定,不同的 systems/textbooks 将以一种或另一种方式定义 SVD。重要的是酉属性U*U'=I
。在任一约定中,奇异向量将最小化投影中的最小二乘距离。
这是理论的发展,其维度约定与 LINPACK 和 R 中的相同:https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter.pdf
要获得完整的 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
第二部分:
diag(c(svd(A)$d,0),nrow=3,ncol=4)
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)
为什么会这样?
根据定理,
v
应该是格式 (4,4),sigma
应该是格式 (3,4).
顺便说一句,创建diag(svd(A)$d)
零填充格式 (3,4) 的最短方法是什么?
这只是一个不同的约定,不同的 systems/textbooks 将以一种或另一种方式定义 SVD。重要的是酉属性U*U'=I
。在任一约定中,奇异向量将最小化投影中的最小二乘距离。
这是理论的发展,其维度约定与 LINPACK 和 R 中的相同:https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter.pdf
要获得完整的 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
第二部分:
diag(c(svd(A)$d,0),nrow=3,ncol=4)