summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/math/statistics/distribution/NormalDistribution.java
diff options
context:
space:
mode:
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.java26
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);
}
}