给定数据矩阵 X.shape = (n, d)
和单个预测变量的估计值 y_pred.shape = (n,)
,可以计算Fisher Information 我
喜欢这样:
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
矩阵会更有效,还是有一种线性代数方法可以加快速度?
谢谢!
最佳答案
方法 #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)
注意:我们可以在 einsum
调用中尝试使用 optimize=True
来进一步提高较新 NumPy 版本的速度。
关于python - Fisher 信息计算扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48695308/