From 4bb762c119f341773d24075a3dc39f6444ace111 Mon Sep 17 00:00:00 2001 From: "joseph.lizier" Date: Fri, 20 Jul 2012 12:33:23 +0000 Subject: [PATCH] Added implementation of differential entropy for Gaussian variables. --- .../TransferEntropyCalculatorKernel.java | 2 +- ...ansferEntropyCalculatorKraskovByMulti.java | 5 +- .../EntropyCalculatorLinearGaussian.java | 90 +++++++++++++++++++ .../ApparentTransferEntropyCalculator.java | 11 +++ .../infodynamics/utils/MatrixUtils.java | 4 +- 5 files changed, 108 insertions(+), 4 deletions(-) create mode 100755 java/source/infodynamics/measures/continuous/lineargaussian/EntropyCalculatorLinearGaussian.java diff --git a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorKernel.java b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorKernel.java index 3c88d18..4cc00de 100755 --- a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorKernel.java +++ b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorKernel.java @@ -61,7 +61,7 @@ public class TransferEntropyCalculatorKernel public static final String FORCE_KERNEL_COMPARE_TO_ALL = "FORCE_KERNEL_COMPARE_TO_ALL"; /** - * Default value for epsilon + * Default value for epsilon (kernel width) */ public static final double DEFAULT_EPSILON = 0.25; /** diff --git a/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java b/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java index efacd6d..5f73b68 100755 --- a/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java +++ b/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java @@ -51,7 +51,7 @@ import java.util.Iterator; *
    *
  1. Construct
  2. *
  3. SetProperty() for each property
  4. - *
  5. intialise()
  6. + *
  7. initialise()
  8. *
  9. setObservations(), or [startAddObservations(), addObservations()*, finaliseAddObservations()] * Note: If not using setObservations(), the results from computeLocal or getSignificance * are not likely to be particularly sensible.
  10. @@ -99,6 +99,9 @@ public class TransferEntropyCalculatorKraskovByMulti createKraskovMiCalculators(); } + /** + * @param k history length (Schreiber k parameter, not Kraskov k parameter) + */ public void initialise(int k) throws Exception { super.initialise(k); // calls initialise(); } diff --git a/java/source/infodynamics/measures/continuous/lineargaussian/EntropyCalculatorLinearGaussian.java b/java/source/infodynamics/measures/continuous/lineargaussian/EntropyCalculatorLinearGaussian.java new file mode 100755 index 0000000..5e74df9 --- /dev/null +++ b/java/source/infodynamics/measures/continuous/lineargaussian/EntropyCalculatorLinearGaussian.java @@ -0,0 +1,90 @@ +package infodynamics.measures.continuous.lineargaussian; + +import infodynamics.measures.continuous.EntropyCalculator; +import infodynamics.utils.MatrixUtils; + +/** + *

    Computes the differential entropy of a given set of observations, assuming that + * the probability distribution function for these observations is Gaussian.

    + * + *

    + * Usage: + *

      + *
    1. Construct
    2. + *
    3. initialise()
    4. + *
    5. setObservations(), or setVariance().
    6. + *
    7. computeAverageLocalOfObservations() to return the average differential + * entropy based on either the set variance or the variance of + * the supplied observations.
    8. + *
    + *

    + * + * @author Joseph Lizier joseph.lizier_at_gmail.com + * + */ +public class EntropyCalculatorLinearGaussian implements EntropyCalculator { + + /** + * Variance of the most recently supplied observations + */ + protected double variance; + + protected boolean debug; + + /** + * Constructor + */ + public EntropyCalculatorLinearGaussian() { + // Nothing to do + } + + /** + * Initialise the calculator ready for reuse + */ + public void initialise() throws Exception { + // Nothing to do + } + + /** + * Provide the observations from which to compute the entropy + * + * @param observations the observations to compute the entropy from + */ + public void setObservations(double[] observations) { + variance = MatrixUtils.stdDev(observations); + variance *= variance; + } + + /** + * Set the variance of the distribution for which we will compute the + * entropy. + * + * @param variance + */ + public void setVariance(double variance) { + this.variance = variance; + } + + /** + * The entropy for a Gaussian-distribution random variable with + * variance \sigma is \log_e{2*pi*e*\sigma}. + * Here we compute the entropy assuming that the recorded estimation of the + * variance is correct (i.e. we will not make a bias correction for limited + * observations here). + * + * @return the entropy of the previously provided observations + */ + public double computeAverageLocalOfObservations() { + return Math.log(2.0*Math.PI*Math.E*variance); + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public void setProperty(String propertyName, String propertyValue) + throws Exception { + // No properties to set here + } + +} diff --git a/java/source/infodynamics/measures/discrete/ApparentTransferEntropyCalculator.java b/java/source/infodynamics/measures/discrete/ApparentTransferEntropyCalculator.java index a2f70e9..10618a6 100755 --- a/java/source/infodynamics/measures/discrete/ApparentTransferEntropyCalculator.java +++ b/java/source/infodynamics/measures/discrete/ApparentTransferEntropyCalculator.java @@ -17,6 +17,9 @@ import infodynamics.utils.RandomGenerator; * 2. Standalone computation from a single set of observations: * Call: computeLocal() or computeAverageLocal() * + * @see For transfer entropy: Schreiber, PRL 85 (2) pp.461-464, 2000; http://dx.doi.org/10.1103/PhysRevLett.85.461 + * @see For local transfer entropy: Lizier et al, PRE 77, 026110, 2008; http://dx.doi.org/10.1103/PhysRevE.77.026110 + * * @author Joseph Lizier * joseph.lizier at gmail.com * http://lizier.me/joseph/ @@ -58,6 +61,14 @@ public class ApparentTransferEntropyCalculator extends ContextOfPastMeasureCalcu */ } + /** + * Create a new TE calculator for the given base and history length. + * + * @param base number of quantisation levels for each variable. + * E.g. binary variables are in base-2. + * @param history history length of the destination to condition on - + * this is k in Schreiber's notation. + */ public ApparentTransferEntropyCalculator(int base, int history) { super(base, history); diff --git a/java/source/infodynamics/utils/MatrixUtils.java b/java/source/infodynamics/utils/MatrixUtils.java index 8e206f2..d68b63b 100755 --- a/java/source/infodynamics/utils/MatrixUtils.java +++ b/java/source/infodynamics/utils/MatrixUtils.java @@ -2544,8 +2544,8 @@ public class MatrixUtils { /** *

    Private function to compute the determinant recursively. - * determinant() calls this after checking the matrix dimensions.
    - * See - http://mathworld.wolfram.com/Determinant.html + * {@link determinant()} calls this after checking the matrix dimensions.
    + * @see {@link http://mathworld.wolfram.com/Determinant.html} *

    * * @param matrix