Source code for monte_carlo_analysis.uncertainty_metrics.MutualInformationMultipleDistribution

"""
**Author** : Robin Camarasa

**Institution** : Erasmus Medical Center

**Position** : PhD student

**Contact** : r.camarasa@erasmusmc.nl

**Date** : 2020-10-14

**Project** : monte_carlo_analysis

**Implement class MutualInformationMultipleDistributions**

"""
from monte_carlo_analysis.uncertainty_metrics import MultipleDistributionsUncertaintyMetric
import numpy as np
from numba import jit


[docs]class MutualInformationMultipleDistributions(MultipleDistributionsUncertaintyMetric): """Implement MutualInformationMultipleDistributions. The formula applied to the family of distributions :math:`(q_{c'}(y_j|x))_{1 \leq c \leq C}` is: .. math:: M^m((q_c(y_{j}|x))_{1 \leq c \leq C}) = -\sum_{c=1}^C \mathbb{E}(q_c(y_j |x)) log(\mathbb{E}(q_c(y_j |x)) + T^{-1} \sum_{t=1}^T \sum_{c=1}^C p_c(y_j | x, w=w_t) log(p_c(y_j | x, w=w_t)) """ def __init__(self): super(MutualInformationMultipleDistributions, self) self.transformation = self.get_transformation()
[docs] def get_transformation(self) -> callable: """Define the variance transformation applied to the family of distributions :return: Transformation to apply to the family of distributions """ @jit def transformation(distributions: np.array) -> float: # Compute entropy mean_prediction_per_class = np.mean(distributions, axis=0) # Generate the log_mean_prediction_per_class taking into account # the case of zero means log_mean_prediction_per_class = mean_prediction_per_class[:] log_mean_prediction_per_class[ np.where(log_mean_prediction_per_class == 0) ] = 1 log_mean_prediction_per_class = np.log(log_mean_prediction_per_class) entropy = - np.sum( log_mean_prediction_per_class * mean_prediction_per_class ) # Compute conditional entropy # Generate the log prediction taking into account # the case of zero means log_prediction = distributions[:] log_prediction[ np.where(distributions == 0) ] = 1 log_prediction = np.log(log_prediction) conditional_entropy = -1.0/distributions.shape[0] * np.sum( log_prediction * distributions ) return entropy - conditional_entropy return transformation