R中计算大型矩阵逆的最快方法

问题描述

我需要计算一个帽子矩阵(根据线性回归)。标准R代码为:

H <- tcrossprod(tcrossprod(X,solve(crossprod(X))),X)

,其中X一个相对较大的矩阵(即1e5 * 100),该行必须运行数千次。我知道最大的限制是逆计算,但是叉积也可能很耗时。有没有更快的选择可以执行这些矩阵运算?我尝试了Rcpp并查看了几篇文章,但是我测试过的任何替代方法都比较慢。也许我不是C ++程序员,因为我不是一个高级C ++程序员。

谢谢!

解决方法

逐行跟踪该代码有点困难,因为R代码的设置有些复杂。但是请继续阅读下面的指针。

重要的是,该主题已经讨论了很多次:发生的事情是R将其分发给BLAS (Basic Linear Algebra Subprogram)LAPACK (Linear Algebra PACKage)库。其中包含最有效的已知代码。通常,您无法通过重写获得收益。

一个人可以通过将一种BLAS / LAPACK实现切换为另一种实现来获得性能差异-在线上也有很多很多文章。 R本身带有所谓的“参考BLAS”,已知它是正确的,但速度最慢。您可以根据自己的操作系统切换到Atlas,OpenBLAS,MKL等。安装随附的R manuals中包含有关如何执行此操作的说明。

出于完整性考虑,每个文件switch (op & 0xF0) { case 0x80: /* 8'b1000xxxx */ switch (op & 0x0C) { case 0x0C: /* 8'bxxxx11xx (8'b100011xx) */ break; } break; case 0xA0: /* 8'b1010xxxx */ switch (op & 0x0F) { case 0x0C: /* 8'bxxxx1100 (8'b10101100) */ break; } break; case 0x70: /* 8'b0111xxxx */ switch (op & 0x0F) { case 0x00: /* 8'bxxxx0000 (8'b01110000) */ break; } break; case 0x90: /* 8'b1001xxxx */ break; } 的命令src/main/names.c%*%crossprod均引用tcrossprod。该文件位于文件src/main/array.c中,并执行大量参数检查以及按参数类型排列和分支,但是例如然后调用一个路径

do_matprod

this LAPACK function。对于所有其他人来说,基本上是相同的,这使您不太可能进行优化。