def normalized_mutual_info_score(x, y):
xp = chainer.cuda.get_array_module(x)
contingency = contingency_matrix(x, y)
nonzero_mask = contingency != 0
nonzero_val = contingency[nonzero_mask]
pi = contingency.sum(axis=1, keepdims=True)
pj = contingency.sum(axis=0, keepdims=True)
total_mass = pj.sum()
pi /= total_mass
pj /= total_mass
pi_pj = (pj * pi)[nonzero_mask]
pij = nonzero_val / total_mass
log_pij = xp.log(pij)
log_pi_pj = xp.log(pi_pj)
mi = xp.sum(pij * (log_pij - log_pi_pj))
nmi = mi / max(xp.sqrt(entropy(pi) * entropy(pj)), 1e-10)
return xp.clip(nmi, 0, 1)
评论列表
文章目录