Source code for monte_carlo_analysis.uncertainty_metrics.EntropySingleDistribution
"""
**Author** : Robin Camarasa
**Institution** : Erasmus Medical Center
**Position** : PhD student
**Contact** : r.camarasa@erasmusmc.nl
**Date** : 2020-09-30
**Project** : monte_carlo_analysis
**Implement class EntropySingleDistribution**
"""
from monte_carlo_analysis.uncertainty_metrics import SingleDistributionUncertaintyMetric
import numpy as np
from numba import jit
[docs]class EntropySingleDistribution(SingleDistributionUncertaintyMetric):
"""
Implement EntropySingleDistribution
:param nbins: Number of bins of the histogram
"""
def __init__(self, nbins=100):
super(EntropySingleDistribution, self)
self.nbins = nbins
self.transformation = self.get_transformation(self.nbins)
[docs] def get_transformation(self, nbins) -> callable:
"""
Define the variance transformation applied to the distribution
:return: Transformation to apply varianceto the distribution
"""
@jit
def transformation(distribution: np.array) -> float:
# Discretize the distribution the division
# by the sum is due to np.histogram implementation
discretized_distribution = np.histogram(
distribution, bins=nbins, range=(0, 1),
density=True
)[0]
discretized_distribution /= discretized_distribution.sum()
# Remove the 0 of the log
log_discretized = discretized_distribution[:]
log_discretized[np.where(log_discretized == 0)] = 1
log_discretized = np.log(log_discretized)
return - np.sum(discretized_distribution * log_discretized) / nbins
return transformation