Source code for dit.multivariate.common_informations.mss_common_information

"""
Compute the minimal sufficient statistic common information.
"""

from copy import deepcopy

import numpy as np

from ...algorithms.minimal_sufficient_statistic import insert_joint_mss
from ...helpers import normalize_rvs
from ...utils import unitful
from ..dual_total_correlation import dual_total_correlation
from ..entropy import entropy


[docs]@unitful def mss_common_information(dist, rvs=None, crvs=None, rv_mode=None): """ Compute the minimal sufficient statistic common information, which is the entropy of the join of the minimal sufficent statistic of each variable about the others. Parameters ---------- dist : Distribution The distribution for which the joint minimal sufficient statistic is computed. rvs : list, None The random variables to compute the joint minimal sufficient statistic of. If None, all random variables are used. crvs : list, None The random variables to condition the joint minimal sufficient statistic on. If None, then no random variables are conditioned on. rv_mode : str, None Specifies how to interpret `rvs` and `crvs`. Valid options are: {'indices', 'names'}. If equal to 'indices', then the elements of `crvs` and `rvs` are interpreted as random variable indices. If equal to 'names', the the elements are interpreted as random variable names. If `None`, then the value of `dist._rv_mode` is consulted, which defaults to 'indices'. """ dist = deepcopy(dist) dist.make_sparse() rvs, crvs, rv_mode = normalize_rvs(dist, rvs, crvs, rv_mode) dtc = dual_total_correlation(dist, rvs, crvs, rv_mode) ent = entropy(dist, rvs, crvs, rv_mode) if np.isclose(dtc, ent): return dtc d = insert_joint_mss(dist, -1, rvs, rv_mode) M = entropy(d, [d.outcome_length() - 1], crvs, rv_mode) return M