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