From aa8148eca991727a37b99b9f895d84e06f2383d9 Mon Sep 17 00:00:00 2001 From: Joseph Lizier Date: Mon, 23 Aug 2021 09:09:49 +1000 Subject: [PATCH] Updates to KL entropy estimator: removing NORMALISE property, and adding method for cross entropy --- ...tropyCalculatorMultiVariateKozachenko.java | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/java/source/infodynamics/measures/continuous/kozachenko/EntropyCalculatorMultiVariateKozachenko.java b/java/source/infodynamics/measures/continuous/kozachenko/EntropyCalculatorMultiVariateKozachenko.java index 2586fa1..027ff4c 100755 --- a/java/source/infodynamics/measures/continuous/kozachenko/EntropyCalculatorMultiVariateKozachenko.java +++ b/java/source/infodynamics/measures/continuous/kozachenko/EntropyCalculatorMultiVariateKozachenko.java @@ -98,11 +98,6 @@ public class EntropyCalculatorMultiVariateKozachenko */ protected boolean debug = false; - /** - * Property name for whether to normalise the incoming data to - * mean 0, standard deviation 1 (default true) - */ - public static final String PROP_NORMALISE = "NORMALISE"; /** * Property name for an amount of random Gaussian noise to be * added to the data (default is 1e-8, matching the MILCA toolkit). @@ -376,7 +371,34 @@ public class EntropyCalculatorMultiVariateKozachenko */ @Override public double[] computeLocalUsingPreviousObservations(double[][] states) throws Exception { - throw new Exception("Local method for other data not implemented"); + double sdTermHere = sdTerm(totalObservations, dimensions); + double emConstHere = eulerMascheroniTerm(totalObservations); + double constantToAddIn = sdTermHere + emConstHere; + + double[] minDistance = EuclideanUtils.computeMinEuclideanDistances(rawData); + double entropy = 0.0; + double[] localEntropy = new double[rawData.length]; + if (debug) { + System.out.println("t,\tminDist,\tlogMinDist,\tlocal,\tsum"); + } + for (int t = 0; t < rawData.length; t++) { + localEntropy[t] = Math.log(2.0 * minDistance[t]) * (double) dimensions; + // using natural units + // localEntropy[t] /= Math.log(2); + localEntropy[t] += constantToAddIn; + entropy += localEntropy[t]; + if (debug) { + System.out.println(t + ",\t" + + minDistance[t] + ",\t" + + Math.log(minDistance[t]) + ",\t" + + localEntropy[t] + ",\t" + + entropy); + } + } + entropy /= (double) totalObservations; + lastAverage = entropy; + lastLocalEntropy = localEntropy; + return localEntropy; } /**