根据您的数据矩阵X.shape = (n, d)
和单个预测变量的估算值y_pred.shape = (n,)
,可以像这样计算Fisher信息I
:
V = diags(y_pred * (1 - y_pred)) # V.shape = (n, n), sparse from scipy.sparse.diags
I = X.T.dot(V).dot(X) # I.shape = (d, d)
现在让我们说我想将其扩展到k
数据矩阵,所以X.shape = (k, n, d)
,给我k
FIM I.shape = (k, d, d)
。循环遍历k
矩阵会更有效吗,还是有一种线性代数方法可以加速它?
谢谢!
答案 0 :(得分:2)
方法#1
对于np.tensordot
和np.einsum
-
parte1 = np.tensordot(X, V, axes=(1,0))
out = np.einsum('ijk,ikl->ijl',parte1, X)
对于稀疏矩阵V
,请使用以下内容获取parte1
:
(X.swapaxes(1,2).reshape(-1,n)*V).reshape(k,d,n)
方法#2
或者,在一次einsum
电话会议中
np.einsum('ijk,jl,ilm->ikm',X, V, X)
注意:我们可以在optimize=True
调用中试用einsum
,以便在新的NumPy版本中实现进一步的加速。