From 16cc8e3db24065085b9c906145b2e34f8fc74dc6 Mon Sep 17 00:00:00 2001 From: "joseph.lizier" Date: Thu, 7 Mar 2013 12:46:52 +0000 Subject: [PATCH] Patched digamma function for large k; added extra debug prints to Kraskov MI calculator 2 --- ...ualInfoCalculatorMultiVariateKraskov2.java | 19 +++++++++++++------ .../source/infodynamics/utils/MathsUtils.java | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov2.java b/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov2.java index 2bb600f..bf95408 100755 --- a/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov2.java +++ b/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov2.java @@ -210,16 +210,21 @@ public class MutualInfoCalculatorMultiVariateKraskov2 // And take the digamma before adding into the // average: averageDiGammas += MathsUtils.digamma(n_x) + MathsUtils.digamma(n_y); + // if (debug) { + // System.out.printf("n=%d, \n"); + // } } averageDiGammas /= (double) N; + mi = MathsUtils.digamma(k) - 1.0/(double)k - averageDiGammas + MathsUtils.digamma(N); + miComputed = true; if (debug) { avNx /= (double)N; avNy /= (double)N; - System.out.println(String.format("Average n_x=%.3f, Average n_y=%.3f", avNx, avNy)); + System.out.printf("Average n_x=%.3f, Average n_y=%.3f", avNx, avNy); + System.out.printf("psi(k=%d)=%.4f - 1/k=%.4f - averageDiGammas=%.4f -psi(N)=%.4f => %.4f\n", + k, MathsUtils.digamma(k), 1.0/(double)k, averageDiGammas, MathsUtils.digamma(N), mi); } - mi = MathsUtils.digamma(k) - 1.0/(double)k - averageDiGammas + MathsUtils.digamma(N); - miComputed = true; return mi; } @@ -301,14 +306,16 @@ public class MutualInfoCalculatorMultiVariateKraskov2 averageDiGammas += MathsUtils.digamma(n_x) + MathsUtils.digamma(n_y); } averageDiGammas /= (double) N; + mi = MathsUtils.digamma(k) - 1.0/(double)k - averageDiGammas + MathsUtils.digamma(N); + miComputed = true; if (debug) { avNx /= (double)N; avNy /= (double)N; - System.out.println(String.format("Average n_x=%.3f, Average n_y=%.3f", avNx, avNy)); + System.out.printf("Average n_x=%.3f, Average n_y=%.3f\n", avNx, avNy); + System.out.printf("psi(k=%d)=%.4f - 1/k=%.4f - averageDiGammas=%.4f + psi(N)=%.4f => %.4f\n", + k, MathsUtils.digamma(k), 1.0/(double)k, averageDiGammas, MathsUtils.digamma(N), mi); } - mi = MathsUtils.digamma(k) - 1.0/(double)k - averageDiGammas + MathsUtils.digamma(N); - miComputed = true; return mi; } diff --git a/java/source/infodynamics/utils/MathsUtils.java b/java/source/infodynamics/utils/MathsUtils.java index 125764b..361fc5a 100755 --- a/java/source/infodynamics/utils/MathsUtils.java +++ b/java/source/infodynamics/utils/MathsUtils.java @@ -259,7 +259,7 @@ public class MathsUtils { double result = storedDigammas[highestDigammaArgCalced]; for (int n = highestDigammaArgCalced + 1; n <= d; n++) { result += 1.0 / (double) (n-1); - if (d < NUM_STORED_DIGAMMAS) { + if (n < NUM_STORED_DIGAMMAS) { storedDigammas[n] = result; } }