我得到了两个矩阵(A
和B
),其中第二个有单位长度的行.例如在R中:
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
当B
是满行秩时(在上面的随机矩阵的例子中,k=n),伪逆给出几乎为零的误差.但是,当B不是整行秩时(例如,k>;n)时,伪逆(ginv(B)
)几乎和转置(t(B)
)一样糟糕,特别是当k>;n时.伪逆总是最佳可能的解决方案吗,即使当k>;>;n?