我有一个(编辑的,愚蠢的拼写错误)自变量矩阵,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标准,所以一旦这个工作起来,我将重复这个过程。
我非常感谢一些解决或完全绕过这个问题的方法。谢谢!
对于你显示的帽子矩阵,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)