提问人:Erik Wright 提问时间:7/14/2023 更新时间:7/15/2023 访问量:62
矩阵乘法后恢复矩阵
Recover a matrix after matrix multiplication
问:
我得到了两个矩阵(和),其中第二个矩阵具有单位长度的行。例如,在 R 中:A
B
k <- 1000
m <- 10
n <- 100
A <- matrix(rnorm(m*k), m, k) # m x k
B <- matrix(rnorm(k*n), k, n) # k x n
B <- B/sqrt(rowSums(B^2)) # make rows have unit length
找到第三个矩阵 () 以使矩阵 ABC 的乘法尽可能接近原始矩阵 A 的最佳方法是什么?那是:C
C <- MASS::ginv(B) # what is the best way to get C?
# [m x k] = [m x k] * [k x n] * [n x k]
A2 <- A %*% B %*% C
plot(A, A2, pch=46)
abline(a=0, b=1)
sum((A - A2)^2) # goal is to minimize this value
当是整行秩时(在上面的随机矩阵示例中,k <= n),伪逆给出的误差几乎为零。但是,当 B 不是整行秩时(例如,k > n),那么伪逆 () 几乎和转置 () 一样糟糕,尤其是当 k >> n 时。伪逆是否总是最好的解,即使 k >> n 也是如此?B
ginv(B)
t(B)
答:
2赞
one
7/15/2023
#1
是的,伪逆是最好的解决方案。
显然,最好的 C 是 B^T(B B^T)^{-1},这被称为右逆。但是,这仅适用于整行排名矩阵。
对于 k>n,我们能做的最好的事情是 (B^T B)^{-1} B^T,这被称为左逆。这是因为 B (B^T B)^-1 B^T 是投影到 B 的列空间上的投影矩阵。对于这个问题,这确实是 B 的伪逆。
C <- MASS::ginv(B)
left_inverse <- solve(t(B) %*%B) %*% t(B)
all.equal(left_inverse,C)
[1] TRUE
此外,伪逆是最小二乘问题的最佳近似。我认为结果可以扩展到这个问题。
评论