所以我有这些巨大的矩阵 X 和 Y。X 和 Y 都有 1 亿行,X 有 10 列。我正在尝试用这些矩阵实现线性回归,并且我需要数量(X^T*X)^-1 * X^T * Y。我怎样才能尽可能节省空间地计算它?
现在我有
X = readMatrix("fileX.txt")
Y = readMatrix("fileY.txt")
return (X.getT() * X).getI() * X.getT() * Y
Run Code Online (Sandbox Code Playgroud)
这里内存中存储了多少个矩阵?是否同时存储两个以上的矩阵?有更好的方法吗?
我有大约 1.5 GB 的内存用于这个项目。如果我关闭所有其他程序,我可能可以将其扩展到 2 或 2.5。理想情况下,该进程也将在很短的时间内运行,但内存限制更加严格。
我尝试过的另一种方法是将计算的中间步骤保存为文本文件,并在每个步骤后重新加载它们。但这非常慢。
X 的大小为 100e6 x 10 Y 的大小为 100e6 x 1
所以最终的大小(X^T*X)^-1 * X^T * Y是 10 x 1
您可以通过以下步骤计算:
a = X^T*X-> 10 x 10b = X^T*Y-> 10 x 1a^-1 * b 步骤3中的矩阵非常小,因此您只需执行一些中间步骤即可计算1和2。
例如,您可以读取 X 和 Y 的第 0 列,并通过 进行计算numpy.dot(X0, Y)。
对于float64数据类型,X0和Y的大小约为1600M,如果内存放不下,可以分别调用numpy.dot两次,分别对X0和Y的前半部分和后半部分进行处理。
因此,要计算,X^T*Y您需要调用 numpy.dot 20 次,要计算,X^T*X您需要调用 numpy.dot 200 次。
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |