Source code for monte_carlo_analysis.uncertainty_metrics.EntropyMultipleDistributions

"""
**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 EntropyMultipleDistributions**

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


[docs]class EntropyMultipleDistributions(MultipleDistributionsUncertaintyMetric): """Implement EntropyMultipleDistributions. The formula applied to the family of distributions :math:`(q_{c'}(y_j|x))_{1 \leq c \leq C}` is: .. math:: M^h((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))) """ def __init__(self): super(EntropyMultipleDistributions, self) self.transformation = self.get_transformation()
[docs] def get_transformation(self) -> callable: """ Define the variance transformation applied to a family of distribution :return: Transformation to apply a family of distribution """ @jit def transformation(distributions: np.array) -> float: 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) return - np.sum(log_mean_prediction_per_class * mean_prediction_per_class) return transformation