我想计算一个巨大矩阵的Moore-Penrose伪逆.理想情况下,我想在具有2300万行和1000列的矩阵上进行此操作,但如果需要,我可以通过仅在我的实验的一部分上运行来将行数减少到400万.
显然,将矩阵加载到内存并在其上运行SVD是行不通的. 维基百科指向Krylov子空间方法并提及Arnoldi,Lanczos,Conjugate梯度,GMRES(广义最小残差),BiCGSTAB(biconjugate梯度稳定),QMR(准最小残差),TFQMR(无转置QMR)和MINRES(最小残差) )方法是最好的Krylov子空间方法之一.但我不知道从哪里开始.计算这样一个巨大矩阵的伪逆是否可行?如果是这样,使用哪些算法或软件库?我有一个大型计算集群,所以欢迎并行方法.
这个答案指向R包biglm.那会有用吗?有人用过吗?我通常使用Python,但不介意使用其他语言和工具来完成这项特定任务.
在stackoverflow.com/q/38378118中询问了此问题,但没有令人满意的答案。
LASSO与?= 0等效于普通的最小二乘,但是R glmnet()和lm()R中似乎不是这种情况。为什么?
library(glmnet)
options(scipen = 999)
X = model.matrix(mpg ~ 0 + ., data = mtcars)
y = as.matrix(mtcars["mpg"])
coef(glmnet(X, y, lambda = 0))
lm(y ~ X)
Run Code Online (Sandbox Code Playgroud)
它们的回归系数最多相符2个有效数字,这可能是由于其优化算法的终止条件略有不同:
glmnet lm
(Intercept) 12.19850081 12.30337
cyl -0.09882217 -0.11144
disp 0.01307841 0.01334
hp -0.02142912 -0.02148
drat 0.79812453 0.78711
wt -3.68926778 -3.71530
qsec 0.81769993 0.82104
vs 0.32109677 0.31776
am 2.51824708 2.52023
gear 0.66755681 0.65541
carb -0.21040602 -0.19942
Run Code Online (Sandbox Code Playgroud)
当添加交互项时,差异会更糟。
X = model.matrix(mpg ~ 0 + . + . …Run Code Online (Sandbox Code Playgroud)