矩阵乘法后还原矩阵:最优C矩阵求解及伪逆有效性疑问
矩阵优化问题:伪逆是否为最优解?
问题背景
给定两个矩阵A(m×k)和B(k×n),其中B的行向量为单位长度。目标是寻找最优矩阵C(n×k),使得矩阵乘积ABC尽可能接近A,即最小化误差 $\text{sum}((A - ABC)^2)$(Frobenius范数平方)。
初始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)) # 使行向量为单位长度
尝试用伪逆求解C的代码:
library(MASS) C <- MASS::ginv(B) # 候选解 A2 <- A %*% B %*% C plot(A, A2, pch=46) abline(a=0, b=1) sum((A - A2)^2) # 误差指标
观察到的现象:
- 当B行满秩(k≤n)时,用
ginv(B)得到的误差几乎为0; - 当B非行满秩(k>n,尤其是k远大于n)时,
ginv(B)的效果与转置t(B)几乎一样差。
核心问题解答
伪逆是否始终是该问题的最优解?
答案取决于“伪逆的对象”:
若使用
ginv(B)作为C:不是。- 仅当B行满秩时,
B %*% ginv(B) = I_k(单位矩阵),此时ABC = A %*% B %*% ginv(B) = A,误差为0,是最优解; - 当B非行满秩时,
B %*% ginv(B)是秩为n的投影矩阵(不等于单位矩阵),此时ABC只是A在B列空间的投影,无法最小化目标误差。
- 仅当B行满秩时,
若针对问题构造正确的伪逆解:是。
目标等价于求解线性方程组AB %*% C = A的最小二乘解,最优解为:
$$C = \text{ginv}(AB) %*% A$$
其中ginv(AB)是矩阵AB的Moore-Penrose伪逆,这是Frobenius范数下的唯一最小范数最优解。
修正后的最优解代码示例
library(MASS) k <- 1000 m <- 10 n <- 100 A <- matrix(rnorm(m*k), m, k) B <- matrix(rnorm(k*n), k, n) B <- B/sqrt(rowSums(B^2)) # 计算最优C AB <- A %*% B C_opt <- ginv(AB) %*% A # 计算近似结果与误差 A2_opt <- AB %*% C_opt error_opt <- sum((A - A2_opt)^2) # 对比原方案 C_prev <- ginv(B) A2_prev <- A %*% B %*% C_prev error_prev <- sum((A - A2_prev)^2) cat("最优解误差:", error_opt, "\n") cat("原方案误差:", error_prev, "\n") # 可视化对比 par(mfrow=c(1,2)) plot(A, A2_opt, pch=46, main="最优解: ABC ≈ A") abline(a=0, b=1) plot(A, A2_prev, pch=46, main="原方案: ABC ≈ A") abline(a=0, b=1)
运行代码后可见,当k>n时,最优解的误差会显著低于原方案的误差。
内容的提问来源于stack exchange,提问作者Erik Wright
相关产品推荐
相关产品推荐

