diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java b/src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java index 919cc2e3..9180b59e 100644 --- a/src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java +++ b/src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java @@ -32,7 +32,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil; * * @author Erich Schubert */ -public class NormalDistribution implements Distribution { +public class NormalDistribution implements DistributionWithRandom { /** * Coefficients for erf approximation. * @@ -148,20 +148,25 @@ public class NormalDistribution implements Distribution { public double pdf(double val) { return pdf(val, mean, stddev); } - + @Override public double cdf(double val) { return cdf(val, mean, stddev); } @Override + public double quantile(double q) { + return quantile(q, mean, stddev); + } + + @Override public double nextRandom() { return mean + random.nextGaussian() * stddev; } @Override public String toString() { - return "Normal Distribution (mean="+mean+", stddev="+stddev+")"; + return "NormalDistribution(mean=" + mean + ", stddev=" + stddev + ")"; } /** @@ -195,7 +200,7 @@ public class NormalDistribution implements Distribution { if(Double.isInfinite(x)) { return (x < 0.0) ? 2 : 0; } - + double result = Double.NaN; double absx = Math.abs(x); // First approximation interval @@ -249,7 +254,7 @@ public class NormalDistribution implements Distribution { * @return erfinv(x) */ public static double erfinv(double x) { - return standardNormalProbit(0.5 * (x + 1)) / MathUtil.SQRT2; + return standardNormalQuantile(0.5 * (x + 1)) / MathUtil.SQRT2; } /** @@ -261,10 +266,13 @@ public class NormalDistribution implements Distribution { * by Peter John Acklam * </p> * + * FIXME: precision of this seems to be rather low, compared to our other + * functions. Only about 8-9 digits agree with SciPy/GNU R. + * * @param d Quantile. Must be in [0:1], obviously. * @return Inverse erf. */ - public static double standardNormalProbit(double d) { + public static double standardNormalQuantile(double d) { if(d == 0) { return Double.NEGATIVE_INFINITY; } @@ -319,7 +327,7 @@ public class NormalDistribution implements Distribution { * @return The CDF of the normal given distribution at x. */ public static double cdf(double x, double mu, double sigma) { - return (1 + erf(x / Math.sqrt(2))) / 2; + return .5 * (1 + erf((x - mu) / (MathUtil.SQRT2 * sigma))); } /** @@ -331,7 +339,7 @@ public class NormalDistribution implements Distribution { * @param sigma Standard deviation. * @return The probit of the normal given distribution at x. */ - public static double probit(double x, double mu, double sigma) { - return mu + sigma * standardNormalProbit(x); + public static double quantile(double x, double mu, double sigma) { + return mu + sigma * standardNormalQuantile(x); } } |