Source code for infovar.stats.info_theory

from typing import List, Union

import numpy as np

__all__ = [
    "condh_to_mse_gaussian",
    "condh_to_rmse_gaussian",
    "corr_to_info_gaussian_1d",
    "corr_to_info_gaussian_nd",
    "info_to_corr_gaussian"
]

# Lower bound of MSE
[docs] def condh_to_mse_gaussian( condh: Union[float, np.ndarray], dim: int=1, base: float=2 ) -> Union[float, np.ndarray]: """ Converts conditional differential entropy into estimation mean squared error (MSE) under multivariate Gaussian assumption. Parameters ---------- condh : Union[float, np.ndarray] Conditional differential entropy. dim : int, optional Dimension of multivariate Gaussian variable, by default 1 (univariate case). base : float, optional Base of differential entropy, by default 2 (bits). Returns ------- Union[float, np.ndarray] Estimation mean squared error. """ return dim / (2*np.pi*np.e) * np.exp(2/dim*condh*np.log(base))
# Lower bound of RMSE
[docs] def condh_to_rmse_gaussian( condh: Union[float, np.ndarray], dim: int=1, base: float=2 ) -> Union[float, np.ndarray]: """ Converts conditional differential entropy into estimation root mean squared error (RMSE) under multivariate Gaussian assumption. Parameters ---------- condh : Union[float, np.ndarray] Conditional differential entropy. dim : int, optional Dimension of multivariate Gaussian variable, by default 1 (univariate case). base : float, optional Base of differential entropy, by default 2 (bits). Returns ------- Union[float, np.ndarray] Estimation root mean squared error. """ return np.sqrt(condh_to_mse_gaussian(condh, dim=dim, base=base))
# Correlation to amount of information
[docs] def corr_to_info_gaussian_1d( rho: Union[float, np.ndarray], base: float=2 ) -> float: """ Converts Pearson correlation coefficient into mutual information under univariate Gaussian asumption. Parameters ---------- rho : Union[float, np.ndarray] Pearson correlation coefficient or array of correlation coefficients. base : float, optional Base of mutual information, by default 2 (bits). Returns ------- float Mutual information between the two subsets of variables. """ assert isinstance(rho, (float, np.ndarray)) return - 0.5 * np.log(1 - rho**2) / np.log(base)
[docs] def corr_to_info_gaussian_nd( C: np.ndarray, I1: List[int], I2: List[int], base: float=2 ) -> float: """ Converts covariance matrix into mutual information under multivariate Gaussian asumption. Parameters ---------- C : np.ndarray Full covariance matrix of multivariate normal variable. I1 : List[int] Indices of first subset of variables. I2 : List[int] Indices of second subset of variables. base : float, optional Base of mutual information, by default 2 (bits). Returns ------- float Mutual information between the two subsets of variables. """ C1, C2 = C[I1, I1], C[I2, I2] return 0.5 * np.log(np.det(C1) * np.det(C2) / np.det(C)) / np.log(base)
# Information to correlation
[docs] def info_to_corr_gaussian( mi: float, base: float=2 ) -> float: """ Converts mutual information into a Pearson correlation coefficient under multivariate Gaussian asumption. Parameters ---------- mi : float Mutual information. base : float, optional Base of mutual information, by default 2 (bits). Returns ------- float Correlation coefficient. """ return np.sqrt(1 - base**(-2*mi))