def nci(x, m, P):
# dimension of state, # time steps, # MC simulations, # inference algorithms (filters/smoothers)
d, time, mc_sims, algs = m.shape
dx = x[..., na] - m
# Mean Square Error matrix
MSE = np.empty((d, d, time, mc_sims, algs))
for k in range(time):
for s in range(mc_sims):
for alg in range(algs):
MSE[..., k, s, alg] = np.outer(dx[..., k, s, alg], dx[..., k, s, alg])
MSE = MSE.mean(axis=3) # average over MC simulations
# dx_iP_dx = np.empty((1, time, mc_sims, algs))
NCI = np.empty((1, time, mc_sims, algs))
for k in range(1, time):
for s in range(mc_sims):
for alg in range(algs):
# iP_dx = cho_solve(cho_factor(P[:, :, k, s, alg]), dx[:, k, s, alg])
# dx_iP_dx[:, k, s, alg] = dx[:, k, s, alg].dot(iP_dx)
# iMSE_dx = cho_solve(cho_factor(MSE[..., k, fi]), dx[:, k, s, alg])
# NCI[..., k, s, fi] = 10*np.log10(dx_iP_dx[:, k, s, fi]) - 10*np.log10(dx[:, k, s, alg].dot(iMSE_dx))
dx_iP_dx = dx[:, k, s, alg].dot(np.linalg.inv(P[..., k, s, alg])).dot(dx[:, k, s, alg])
dx_iMSE_dx = dx[:, k, s, alg].dot(np.linalg.inv(MSE[..., k, alg])).dot(dx[:, k, s, alg])
NCI[..., k, s, alg] = 10 * np.log10(dx_iP_dx) - 10 * np.log10(dx_iMSE_dx)
return NCI[:, 1:, ...].mean(axis=1) # average over time steps (ignore the 1st)
评论列表
文章目录