矩阵乘法后恢复矩阵

Recover a matrix after matrix multiplication

提问人:Erik Wright 提问时间:7/14/2023 更新时间:7/15/2023 访问量:62

问:

我得到了两个矩阵(和),其中第二个矩阵具有单位长度的行。例如,在 R 中:AB

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 也是如此?Bginv(B)t(B)

R -逆矩阵

评论


答:

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

此外,伪逆是最小二乘问题的最佳近似。我认为结果可以扩展到这个问题。