从具有大量行的独立变量矩阵计算帽子矩阵的轨迹;如何避免内存错误?

问题描述 投票:0回答:1

我有一个(编辑的,愚蠢的拼写错误)自变量矩阵,X。我想要从X计算出的帽子矩阵的轨迹,或者找到一些计算捷径来获得该轨迹而不实际计算帽子矩阵。问题是X有14826行。

res = glm_binom.fit()
YHatTemp = res.mu
HatMatTemp = X*res.pinv_wexog

(或者,替换第三行)

HatMatTemp = X*np.linalg.inv(np.transpose(X)*X)*np.transpose(X)

以上给出了以下内容:

File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, in __mul__
return N.dot(self, asmatrix(other))
MemoryError

我想首先追踪帽子矩阵的原因是为了模型选择而计算GCV标准,所以一旦这个工作起来,我将重复这个过程。

我非常感谢一些解决或完全绕过这个问题的方法。谢谢!

python numpy regression matrix-multiplication statsmodels
1个回答
2
投票

对于你显示的帽子矩阵,hat = X.dot(np.linalg.inv(X.T.dot(X)).dot(X.T)),跟踪只是rank(X),所以如果X有完整的列级别和列数少于行,那么这就是X.shape[1]。你在这里找到的是无偏线性估计量的自由度 - 普通最小二乘法。

但是,您执行GCV的意图需要完全了解帽子矩阵的对角线。您无需计算全帽矩阵就可以计算出来,如下所示:

import numpy as np
rng = np.random.RandomState(42)
n_samples, n_features = 20, 5
X = rng.randn(n_samples, n_features)

hat = X.dot(np.linalg.inv(X.T.dot(X)).dot(X.T))

hat_diag = np.diagonal(hat)
trace = hat_diag.sum()  # this is equal to n_features == 5
print trace

only_diag = np.einsum('ij, ij -> j', X.T, np.linalg.inv(X.T.dot(X)).dot(X.T))

print (only_diag == hat_diag).all()  # this evaluates to True

可以看出,only_diag包含对角线。您也可以使用更高的内存占用,通过这种方式计算它

only_diag = (X.T * np.linalg.inv(X.T.dot(X)).dot(X.T)).sum(0)
© www.soinside.com 2019 - 2024. All rights reserved.