我得到了两个矩阵(AB),其中第二个有单位长度的行.例如在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&gt;n)时,伪逆(ginv(B))几乎和转置(t(B))一样糟糕,特别是当k&gt;n时.伪逆总是最佳可能的解决方案吗,即使当k&gt;&gt;n?

推荐答案

是的,伪逆是最好的可能解.

显然,最好的C是B^T(B B^T)^{-1},也就是所谓的右逆.然而,这仅适用于整行秩矩阵.

对于k>;n,我们最多只能做(B^T,B)^{-1}B^T,也就是所谓的左逆.这是因为B(B^T B)^-1B^T是投影到B的列空间上的投影矩阵,这确实是B的伪逆.

C <- MASS::ginv(B)
left_inverse <- solve(t(B) %*%B) %*% t(B)
all.equal(left_inverse,C)
[1] TRUE

此外,伪逆是最小二乘问题的最佳逼近.这个结果可以推广到这个问题.

R相关问答推荐

从gtsummary包中使用tBL_strata()和tBL_summary()时删除变量标签

使用gcuminc,如何使用逗号格式化风险表?

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

如何在R中对深度嵌套的tibbles中的非空连续行求和?

在R中使用download. file().奇怪的URL?

在嵌套列表中查找元素路径的最佳方法

如何对2个列表元素的所有组合进行操作?

R中边际效应包中Logistic回归的交互作用风险比

展开对数比例绘图的轴(添加填充)

如何在科学记数法中显示因子

在保留列表元素属性的同时替换列表元素

从数据创建数字的命名列表.R中的框

在R中使用列表(作为tibble列)进行向量化?

优化从每个面的栅格中提取值

为什么我对圆周率图的蒙特卡罗估计是空的?

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

抽样变换-REXP与RWEIBUR

roxygen2正在处理太多的文件

创建两个变量组合的索引矩阵

如果缺少时间,如何向日期-时间列添加时间